diff --git a/cli/cmd/encore/app/create.go b/cli/cmd/encore/app/create.go index 78f049721e..24713c101f 100644 --- a/cli/cmd/encore/app/create.go +++ b/cli/cmd/encore/app/create.go @@ -24,6 +24,7 @@ import ( "encr.dev/internal/conf" "encr.dev/internal/env" "encr.dev/internal/version" + "encr.dev/pkg/appfile" "encr.dev/pkg/github" "encr.dev/pkg/xos" ) @@ -151,10 +152,12 @@ func createApp(ctx context.Context, name, template string) (err error) { } } - encoreAppPath := filepath.Join(name, "encore.app") + encoreAppPath := filepath.Join(name, appfile.Name) appData, err := os.ReadFile(encoreAppPath) if err != nil { - appData, err = []byte("{}"), nil + appData, err = []byte(`{ + "$schema": "https://encore.dev/schemas/appfile.schema.json" +}`), nil } if app != nil { @@ -504,7 +507,12 @@ func setEncoreAppID(data []byte, id string, commentLines []string) ([]byte, erro Value: hujson.Literal(jsonValue), } + schemaValue := hujson.Value{ + Value: hujson.Literal(`"https://encore.dev/schemas/appfile.schema.json"`), + } + found := false + foundSchema := false for i := range obj.Members { m := &obj.Members[i] if lit, ok := m.Name.Value.(hujson.Literal); ok && lit.String() == "id" { @@ -515,6 +523,10 @@ func setEncoreAppID(data []byte, id string, commentLines []string) ([]byte, erro found = true break } + if lit, ok := m.Name.Value.(hujson.Literal); ok && lit.String() == "$schema" { + foundSchema = true + m.Value = schemaValue + } } if !found { @@ -527,6 +539,15 @@ func setEncoreAppID(data []byte, id string, commentLines []string) ([]byte, erro }}, obj.Members...) } + if !foundSchema { + obj.Members = append([]hujson.ObjectMember{{ + Name: hujson.Value{ + Value: hujson.Literal(`"$schema"`), + }, + Value: schemaValue, + }}, obj.Members...) + } + root.Format() return root.Pack(), nil } diff --git a/cli/cmd/encore/app/create_test.go b/cli/cmd/encore/app/create_test.go index f260070627..0cf1fd87de 100644 --- a/cli/cmd/encore/app/create_test.go +++ b/cli/cmd/encore/app/create_test.go @@ -17,6 +17,7 @@ func Test_setEncoreAppID(t *testing.T) { id: "foo", commentLines: []string{"bar"}, want: `{ + "$schema": "https://encore.dev/schemas/appfile.schema.json", // bar "id": "foo", } @@ -27,6 +28,7 @@ func Test_setEncoreAppID(t *testing.T) { id: "foo", commentLines: []string{"bar"}, want: `{ + "$schema": "https://encore.dev/schemas/appfile.schema.json", // bar "id": "foo", } @@ -40,6 +42,7 @@ func Test_setEncoreAppID(t *testing.T) { id: "foo", commentLines: []string{"bar", "baz"}, want: `{ + "$schema": "https://encore.dev/schemas/appfile.schema.json", // bar // baz "id": "foo", @@ -48,6 +51,7 @@ func Test_setEncoreAppID(t *testing.T) { }, { data: []byte(`{ + "$schema": "https://encore.dev/AN-OLD-SCHEMA", "some_other_field": true, // foo "id": "test", @@ -55,6 +59,7 @@ func Test_setEncoreAppID(t *testing.T) { id: "foo", commentLines: []string{"bar", "baz"}, want: `{ + "$schema": "https://encore.dev/schemas/appfile.schema.json", "some_other_field": true, // bar // baz diff --git a/cli/cmd/encore/app/initialize.go b/cli/cmd/encore/app/initialize.go index 1e59e4aaaa..0dfb1c8cc8 100644 --- a/cli/cmd/encore/app/initialize.go +++ b/cli/cmd/encore/app/initialize.go @@ -87,6 +87,7 @@ func initializeApp(name string) error { // Create the encore.app file encoreAppData := []byte(`{ + "$schema": "https://encore.dev/schemas/appfile.schema.json", "id": "` + app.Slug + `", } `) diff --git a/cli/daemon/apps/apps.go b/cli/daemon/apps/apps.go index 99987affd2..ebe062c31a 100644 --- a/cli/daemon/apps/apps.go +++ b/cli/daemon/apps/apps.go @@ -365,7 +365,16 @@ func (i *Instance) GlobalCORS() (appfile.CORS, error) { } return *cors, nil +} + +// BuildConfig returns the build settings for this app. +func (i *Instance) BuildConfig() (appfile.BuildCfg, error) { + build, err := appfile.Build(i.root) + if err != nil { + return appfile.BuildCfg{}, err + } + return build, nil } func (i *Instance) Watch(fn WatchFunc) (WatchSubscriptionID, error) { diff --git a/cli/daemon/dash/dash.go b/cli/daemon/dash/dash.go index 06015ede0b..77d76b96c9 100644 --- a/cli/daemon/dash/dash.go +++ b/cli/daemon/dash/dash.go @@ -13,6 +13,7 @@ import ( "path/filepath" "slices" "strings" + "sync" "github.com/golang/protobuf/jsonpb" "github.com/rs/zerolog/log" @@ -26,6 +27,7 @@ import ( "encr.dev/internal/version" "encr.dev/parser/encoding" "encr.dev/pkg/editors" + "encr.dev/pkg/errinsrc" "encr.dev/pkg/errlist" tracepb2 "encr.dev/proto/encore/engine/trace2" meta "encr.dev/proto/encore/parser/meta/v1" @@ -378,6 +380,10 @@ func (s *Server) OnStart(r *run.Run) { } func (s *Server) OnCompileStart(r *run.Run) { + lastErrorMu.Lock() + lastError[r.App.PlatformOrLocalID()] = nil + lastErrorMu.Unlock() + status, err := buildAppStatus(r.App, r) if err != nil { log.Error().Err(err).Msg("dash: could not build app status") @@ -394,6 +400,11 @@ func (s *Server) OnCompileStart(r *run.Run) { // OnReload notifies active websocket clients about the reloaded run. func (s *Server) OnReload(r *run.Run) { + // A reload means a successful compile, so clear any previous compile errors. + lastErrorMu.Lock() + lastError[r.App.PlatformOrLocalID()] = nil + lastErrorMu.Unlock() + status, err := buildAppStatus(r.App, r) if err != nil { log.Error().Err(err).Msg("dash: could not build app status") @@ -430,8 +441,16 @@ func (s *Server) OnStderr(r *run.Run, out []byte) { s.onOutput(r, out) } -func (s *Server) OnError(r *run.Run, err *errlist.List) { - if err == nil { +var lastErrorMu sync.Mutex +var lastError = make(map[string]*errlist.List) + +func (s *Server) OnError(r *run.Run, compileErr *errlist.List) { + lastErrorMu.Lock() + compileErr.MakeRelative(r.App.Root(), "") + lastError[r.App.PlatformOrLocalID()] = compileErr + lastErrorMu.Unlock() + + if compileErr == nil { return } @@ -441,10 +460,6 @@ func (s *Server) OnError(r *run.Run, err *errlist.List) { return } - err.MakeRelative(r.App.Root(), "") - - status.CompileError = err.Error() - s.notify(¬ification{ Method: "process/compile-error", Params: status, @@ -735,16 +750,17 @@ func makeProtoReplier(rep jsonrpc2.Replier) jsonrpc2.Replier { // // It is mirrored in the frontend at src/lib/client/dev-dash-client.ts as `AppStatus`. type appStatus struct { - Running bool `json:"running"` - AppID string `json:"appID"` - PlatformID string `json:"platformID,omitempty"` - AppRoot string `json:"appRoot"` - PID string `json:"pid,omitempty"` - Meta json.RawMessage `json:"meta,omitempty"` - Addr string `json:"addr,omitempty"` - APIEncoding *encoding.APIEncoding `json:"apiEncoding,omitempty"` - Compiling bool `json:"compiling"` - CompileError string `json:"compileError,omitempty"` + Running bool `json:"running"` + AppID string `json:"appID"` + PlatformID string `json:"platformID,omitempty"` + AppRoot string `json:"appRoot"` + PID string `json:"pid,omitempty"` + Meta json.RawMessage `json:"meta,omitempty"` + Addr string `json:"addr,omitempty"` + APIEncoding *encoding.APIEncoding `json:"apiEncoding,omitempty"` + Compiling bool `json:"compiling"` + CompileError string `json:"compileError,omitempty"` + CompileErrorRaw *errlist.List `json:"compileErrorRaw,omitempty"` } func buildAppStatus(app *apps.Instance, runInstance *run.Run) (s appStatus, err error) { @@ -778,14 +794,28 @@ func buildAppStatus(app *apps.Instance, runInstance *run.Run) (s appStatus, err apiEnc = encoding.DescribeAPI(md) } + lastErrorMu.Lock() + compileErr := lastError[app.PlatformOrLocalID()] + lastErrorMu.Unlock() + + errStr := "" + if compileErr != nil && compileErr.List.Len() > 0 { + wasEnabled := errinsrc.ColoursEnabled() + errinsrc.ColoursInErrors(true) + errStr = compileErr.Error() + errinsrc.ColoursInErrors(wasEnabled) + } + // Build the response resp := appStatus{ - Running: false, - AppID: app.PlatformOrLocalID(), - PlatformID: app.PlatformID(), - Meta: json.RawMessage(mdStr), - AppRoot: app.Root(), - APIEncoding: apiEnc, + Running: false, + AppID: app.PlatformOrLocalID(), + PlatformID: app.PlatformID(), + Meta: json.RawMessage(mdStr), + AppRoot: app.Root(), + APIEncoding: apiEnc, + CompileError: errStr, + CompileErrorRaw: compileErr, } if runInstance != nil { resp.Running = true diff --git a/cli/daemon/engine/trace2/sqlite/write.go b/cli/daemon/engine/trace2/sqlite/write.go index 9fc341fc51..69bf0ee1b6 100644 --- a/cli/daemon/engine/trace2/sqlite/write.go +++ b/cli/daemon/engine/trace2/sqlite/write.go @@ -153,6 +153,25 @@ func (s *Store) updateSpanStartIndex(ctx context.Context, meta *trace2.Meta, ev return nil } + if span := start.GetGeneric(); span != nil { + _, err := s.db.ExecContext(ctx, ` + INSERT INTO trace_span_index ( + app_id, trace_id, span_id, span_type, started_at, is_root, service_name, endpoint_name, has_response, test_skipped + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, false, false) + ON CONFLICT (trace_id, span_id) DO UPDATE SET + is_root = excluded.is_root, + service_name = excluded.service_name, + endpoint_name = excluded.endpoint_name, + external_request_id = excluded.external_request_id + `, meta.AppID, encodeTraceID(ev.TraceId), encodeSpanID(ev.SpanId), + tracepbcli.SpanSummary_GENERIC_SPAN, ev.EventTime.AsTime().UnixNano(), + isRoot, "", span.SpanName) + if err != nil { + return errors.Wrap(err, "insert trace span event") + } + return nil + } + return nil } @@ -241,6 +260,24 @@ func (s *Store) updateSpanEndIndex(ctx context.Context, meta *trace2.Meta, ev *t return nil } + if req := end.GetGeneric(); req != nil { + _, err := s.db.ExecContext(ctx, ` + INSERT INTO trace_span_index ( + app_id, trace_id, span_id, span_type, has_response, is_error, duration_nanos + ) VALUES (?, ?, ?, ?, ?, ?, ?) + ON CONFLICT (trace_id, span_id) DO UPDATE SET + has_response = excluded.has_response, + is_error = excluded.is_error, + duration_nanos = excluded.duration_nanos + `, meta.AppID, traceID, spanID, + tracepbcli.SpanSummary_GENERIC_SPAN, true, + end.Error != nil, end.DurationNanos) + if err != nil { + return errors.Wrap(err, "insert trace span event") + } + return nil + } + return nil } diff --git a/cli/daemon/export/export.go b/cli/daemon/export/export.go index b8c22f0738..42d71a9548 100644 --- a/cli/daemon/export/export.go +++ b/cli/daemon/export/export.go @@ -46,11 +46,21 @@ func Docker(ctx context.Context, app *apps.Instance, req *daemonpb.ExportRequest return false, errors.Wrap(err, "get experimental features") } + buildConfig, err := app.BuildConfig() + if err != nil { + return false, errors.Wrap(err, "get build settings") + } + if req.CgoEnabled { + buildConfig.CgoEnabled = true + } + if params.BaseImageTag != "" { + buildConfig.Docker.BaseImage = params.BaseImageTag + } + vcsRevision := vcs.GetRevision(app.Root()) buildInfo := builder.BuildInfo{ BuildTags: []string{"timetzdata"}, - CgoEnabled: req.CgoEnabled, - StaticLink: true, + BuildConfig: buildConfig, Debug: false, GOOS: req.Goos, GOARCH: req.Goarch, diff --git a/cli/daemon/run/check.go b/cli/daemon/run/check.go index 4605d910a4..de37d6375e 100644 --- a/cli/daemon/run/check.go +++ b/cli/daemon/run/check.go @@ -43,11 +43,15 @@ func (mgr *Manager) Check(ctx context.Context, p CheckParams) (buildDir string, // TODO: We should check that all secret keys are defined as well. + buildConfig, err := p.App.BuildConfig() + if err != nil { + return "", errors.Wrap(err, "get build settings") + } + vcsRevision := vcs.GetRevision(p.App.Root()) buildInfo := builder.BuildInfo{ BuildTags: builder.LocalBuildTags, - CgoEnabled: true, - StaticLink: false, + BuildConfig: buildConfig, Debug: false, GOOS: runtime.GOOS, GOARCH: runtime.GOARCH, diff --git a/cli/daemon/run/exec_script.go b/cli/daemon/run/exec_script.go index a2779abe1b..648d1db0b9 100644 --- a/cli/daemon/run/exec_script.go +++ b/cli/daemon/run/exec_script.go @@ -62,6 +62,11 @@ func (mgr *Manager) ExecScript(ctx context.Context, p ExecScriptParams) (err err return err } + buildConfig, err := p.App.BuildConfig() + if err != nil { + return errors.Wrap(err, "get build settings") + } + rm := infra.NewResourceManager(p.App, mgr.ClusterMgr, p.NS, p.Environ, mgr.DBProxyPort, false) defer rm.StopAll() @@ -77,8 +82,7 @@ func (mgr *Manager) ExecScript(ctx context.Context, p ExecScriptParams) (err err vcsRevision := vcs.GetRevision(p.App.Root()) buildInfo := builder.BuildInfo{ BuildTags: builder.LocalBuildTags, - CgoEnabled: true, - StaticLink: false, + BuildConfig: buildConfig, Debug: false, GOOS: runtime.GOOS, GOARCH: runtime.GOARCH, diff --git a/cli/daemon/run/run.go b/cli/daemon/run/run.go index 788cfbfb92..3683e57056 100644 --- a/cli/daemon/run/run.go +++ b/cli/daemon/run/run.go @@ -306,6 +306,11 @@ func (r *Run) buildAndStart(ctx context.Context, tracker *optracker.OpTracker, i return err } + buildConfig, err := r.App.BuildConfig() + if err != nil { + return errors.Wrap(err, "get build settings") + } + if r.builder == nil { r.builder = builderimpl.Resolve(expSet) } @@ -313,8 +318,7 @@ func (r *Run) buildAndStart(ctx context.Context, tracker *optracker.OpTracker, i vcsRevision := vcs.GetRevision(r.App.Root()) buildInfo := builder.BuildInfo{ BuildTags: builder.LocalBuildTags, - CgoEnabled: true, - StaticLink: false, + BuildConfig: buildConfig, Debug: r.Params.Debug, GOOS: runtime.GOOS, GOARCH: runtime.GOARCH, diff --git a/cli/daemon/run/runtime_config.go b/cli/daemon/run/runtime_config.go index 3e5bf85f75..33c430657e 100644 --- a/cli/daemon/run/runtime_config.go +++ b/cli/daemon/run/runtime_config.go @@ -166,7 +166,7 @@ func (g *RuntimeEnvGenerator) runtimeConfigForServices(services []*meta.Service, daemonProxyURL := option.Map(g.DaemonProxyAddr, func(t netip.AddrPort) string { return fmt.Sprintf("http://%s", t) }) - // Build the base config + // BuildCfg the base config runtimeCfg := &config.Runtime{ AppID: g.AppID.GetOrElseF(g.App.PlatformOrLocalID), AppSlug: g.App.PlatformID(), @@ -236,6 +236,7 @@ func (g *RuntimeEnvGenerator) runtimeConfigForServices(services []*meta.Service, for _, svc := range services { // Configure all the SQL databases for the service for _, sqlDB := range g.dbsBySvc[svc.Name] { + // nosemgrep server, db, err := g.InfraManager.SQLConfig(sqlDB) if err != nil { return "", errors.Wrapf(err, "failed to generate SQL config for database %s for service %s", db.DatabaseName, svc.Name) @@ -377,7 +378,7 @@ func (g *RuntimeEnvGenerator) runtimeConfigForGateway(hostnames []string) (strin return "", errors.Wrap(err, "failed to generate global CORS config") } - // Build the base config + // BuildCfg the base config runtimeCfg := &config.Runtime{ AppID: g.AppID.GetOrElseF(g.App.PlatformOrLocalID), AppSlug: g.App.PlatformID(), diff --git a/cli/daemon/run/tests.go b/cli/daemon/run/tests.go index 26cf54ca33..97acff8776 100644 --- a/cli/daemon/run/tests.go +++ b/cli/daemon/run/tests.go @@ -58,6 +58,11 @@ func (mgr *Manager) Test(ctx context.Context, params TestParams) (err error) { return err } + buildConfig, err := params.App.BuildConfig() + if err != nil { + return errors.Wrap(err, "get build settings") + } + secretData, err := params.Secrets.Get(ctx, expSet) if err != nil { return err @@ -69,8 +74,7 @@ func (mgr *Manager) Test(ctx context.Context, params TestParams) (err error) { vcsRevision := vcs.GetRevision(params.App.Root()) buildInfo := builder.BuildInfo{ BuildTags: builder.LocalBuildTags, - CgoEnabled: true, - StaticLink: false, + BuildConfig: buildConfig, Debug: false, GOOS: runtime.GOOS, GOARCH: runtime.GOARCH, diff --git a/cli/daemon/userfacing.go b/cli/daemon/userfacing.go index 523523a5ee..44c41c7862 100644 --- a/cli/daemon/userfacing.go +++ b/cli/daemon/userfacing.go @@ -32,11 +32,15 @@ func (s *Server) genUserFacing(ctx context.Context, app *apps.Instance) error { return errors.Wrap(err, "resolve experiments") } + buildConfig, err := app.BuildConfig() + if err != nil { + return errors.Wrap(err, "get build settings") + } + vcsRevision := vcs.GetRevision(app.Root()) buildInfo := builder.BuildInfo{ BuildTags: builder.LocalBuildTags, - CgoEnabled: true, - StaticLink: false, + BuildConfig: buildConfig, Debug: false, GOOS: runtime.GOOS, GOARCH: runtime.GOARCH, diff --git a/e2e-tests/app_test.go b/e2e-tests/app_test.go index d9af36e1a3..7565af9ab0 100644 --- a/e2e-tests/app_test.go +++ b/e2e-tests/app_test.go @@ -29,6 +29,7 @@ import ( "encr.dev/cli/daemon/run/infra" "encr.dev/cli/daemon/secret" . "encr.dev/internal/optracker" + "encr.dev/pkg/appfile" "encr.dev/pkg/builder" "encr.dev/pkg/builder/builderimpl" "encr.dev/pkg/cueutil" @@ -219,9 +220,11 @@ func testBuild(t testing.TB, appRoot string, env []string) (*builder.ParseResult vcsRevision := vcs.GetRevision(app.Root()) buildInfo := builder.BuildInfo{ - BuildTags: builder.LocalBuildTags, - CgoEnabled: true, - StaticLink: false, + BuildTags: builder.LocalBuildTags, + BuildConfig: appfile.BuildCfg{ + CgoEnabled: true, + StaticLink: false, + }, Debug: false, GOOS: runtime.GOOS, GOARCH: runtime.GOARCH, diff --git a/e2e-tests/testdata/echo/encore.app b/e2e-tests/testdata/echo/encore.app index 9e26dfeeb6..5dec369d9d 100644 --- a/e2e-tests/testdata/echo/encore.app +++ b/e2e-tests/testdata/echo/encore.app @@ -1 +1,8 @@ -{} \ No newline at end of file +{ + "$schema": "https://encore.dev/schemas/appfile.schema.json", + "build": { + "integrations": { + "open_telemetry": true + } + } +} diff --git a/go.mod b/go.mod index a9b09ddc16..94f7d5fb8f 100644 --- a/go.mod +++ b/go.mod @@ -26,8 +26,9 @@ require ( github.com/gofrs/uuid v4.4.0+incompatible github.com/golang-migrate/migrate/v4 v4.15.2 github.com/golang/protobuf v1.5.3 - github.com/google/go-cmp v0.5.9 + github.com/google/go-cmp v0.6.0 github.com/google/go-containerregistry v0.11.0 + github.com/google/renameio/v2 v2.0.0 github.com/gorilla/websocket v1.5.0 github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 github.com/jackc/pgconn v1.14.0 @@ -90,6 +91,8 @@ require ( github.com/docker/go-units v0.5.0 // indirect github.com/emicklei/proto v1.6.15 // indirect github.com/getsentry/sentry-go v0.13.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/swag v0.19.14 // indirect github.com/go-redis/redis/v8 v8.11.5 // indirect @@ -97,7 +100,6 @@ require ( github.com/golang/glog v1.1.0 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.0.1 // indirect - github.com/google/renameio/v2 v2.0.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect @@ -137,6 +139,9 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/vbatts/tar-split v0.11.2 // indirect github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 // indirect + go.opentelemetry.io/otel v1.22.0 // indirect + go.opentelemetry.io/otel/metric v1.22.0 // indirect + go.opentelemetry.io/otel/trace v1.22.0 // indirect go.uber.org/atomic v1.10.0 // indirect golang.org/x/net v0.15.0 // indirect golang.org/x/term v0.12.0 // indirect diff --git a/go.sum b/go.sum index 111b2016ca..3e3786d72f 100644 --- a/go.sum +++ b/go.sum @@ -542,7 +542,10 @@ github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +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/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= @@ -689,8 +692,9 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= github.com/google/go-containerregistry v0.11.0 h1:Xt8x1adcREjFcmDoDK8OdOsjxu90PHkGuwNP8GiHMLM= github.com/google/go-containerregistry v0.11.0/go.mod h1:BBaYtsHPHA42uEgAvd/NejvAfPSlz281sJWqupjSxfk= @@ -1346,8 +1350,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ 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/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -1449,12 +1453,16 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.2 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= +go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y= +go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg= +go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= @@ -1462,6 +1470,8 @@ go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= +go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0= +go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= diff --git a/pkg/appfile/appfile.go b/pkg/appfile/appfile.go index cea963c9be..ca4e2699d1 100644 --- a/pkg/appfile/appfile.go +++ b/pkg/appfile/appfile.go @@ -8,6 +8,7 @@ import ( "io/fs" "os" "path/filepath" + "slices" "github.com/tailscale/hujson" @@ -20,6 +21,8 @@ import ( const Name = "encore.app" // File is a parsed encore.app file. +// +// If you update this struct, please update the matching appfile.schema.json file type File struct { // ID is the encore.dev app id for the app. // It is empty if the app is not linked to encore.dev. @@ -37,7 +40,7 @@ type File struct { GlobalCORS *CORS `json:"global_cors,omitempty"` // Build contains build settings for the application. - Build Build `json:"build,omitempty"` + Build BuildCfg `json:"build,omitempty"` // CgoEnabled enables building with cgo. // @@ -51,13 +54,35 @@ type File struct { DockerBaseImage string `json:"docker_base_image,omitempty"` } -type Build struct { +type BuildCfg struct { // CgoEnabled enables building with cgo. CgoEnabled bool `json:"cgo_enabled,omitempty"` + // StaticLink enables static linking of the application. + StaticLink bool `json:"static_link,omitempty"` + // Docker configures the docker images built // by Encore's CI/CD system. Docker Docker `json:"docker,omitempty"` + + // Integrations configures integrations with third party libraries + // which need to be enabled at build time, otherwise we don't compile + // them into the binary. + Integrations struct { + // OpenTelemetry enables the OpenTelemetry integration, so Encore + // will pickup spans generated through the OpenTelemetry API. + OpenTelemetry bool `json:"open_telemetry,omitempty"` + } `json:"integrations,omitempty"` +} + +// BuildTags returns the build tags to use for this config +func (b BuildCfg) BuildTags(baseSet []string) []string { + finalSet := slices.Clone(baseSet) + if b.Integrations.OpenTelemetry { + finalSet = append(finalSet, "opentelemetry") + } + + return finalSet } type Docker struct { @@ -111,7 +136,7 @@ func Parse(data []byte) (*File, error) { return nil, fmt.Errorf("appfile.Parse: %v", err) } - // Parse deprecated fields into the new Build struct. + // Parse deprecated fields into the new BuildCfg struct. f.Build.CgoEnabled = f.Build.CgoEnabled || f.CgoEnabled if f.Build.Docker.BaseImage == "" { f.Build.Docker.BaseImage = f.DockerBaseImage @@ -159,3 +184,13 @@ func GlobalCORS(appRoot string) (*CORS, error) { } return f.GlobalCORS, nil } + +// Build returns the build configuration for the app located +// at appRoot. +func Build(appRoot string) (BuildCfg, error) { + f, err := ParseFile(filepath.Join(appRoot, Name)) + if err != nil { + return BuildCfg{}, err + } + return f.Build, nil +} diff --git a/pkg/appfile/appfile.schema.json b/pkg/appfile/appfile.schema.json new file mode 100644 index 0000000000..e522438252 --- /dev/null +++ b/pkg/appfile/appfile.schema.json @@ -0,0 +1,111 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://encore.dev/schemas/appfile.schema.json", + "title": "Encore App File", + "description": "The schema for the encore.app file used to configure an Encore project.", + "type": "object", + "properties": { + "id": { + "description": "The ID of this application on https://encore.dev. Is empty if the app has not been linked yet.", + "type": "string", + "default": "" + }, + "experiments": { + "description": "Experiments is a list of values to enable experimental features in Encore. These are not guaranteed to be stable in either runtime behaviour or in API design. Do not use these features in production without consulting the Encore team.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "uniqueItems": true + }, + "build": { + "description": "Contains build settings for the application.", + "type": "object", + "properties": { + "cgo_enabled": { + "description": "Enables building with cgo", + "type": "boolean", + "default": false + }, + "static_link": { + "description": "Enables static linking of the application.", + "type": "boolean", + "default": false + }, + "docker": { + "base_image": { + "description": "Changes the docker base image used for building the application in Encore's CI/CD system. If unspecified it defaults to \"scratch\".", + "type": "string", + "default": "scratch" + }, + "bundle_source": { + "description": "Determines whether the source code of the application should be bundled into the binary.", + "type": "boolean", + "default": false + } + }, + "integrations": { + "description": "Integrations configures integrations with third party libraries which need to be enabled at build time, otherwise we don't compile them into the binary.", + "type": "object", + "properties": { + "open_telemetry": { + "description": "OpenTelemetry enables the OpenTelemetry integration, so Encore will pickup spans generated through the OpenTelemetry API.", + "type": "boolean", + "default": false + } + } + } + } + }, + "global_cors": { + "description": "Configure global CORS settings for the application which will be applied to all API gateways into the application.", + "type": "object", + "properties": { + "debug": { + "description": "Enables CORS debug logging.", + "type": "boolean", + "default": false + }, + "allow_headers": { + "description": "Allows an app to specify additional headers that should be accepted by the app. If the list contains \"*\", then all headers are allowed.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "uniqueItems": true + }, + "expose_headers": { + "description": "Allows an app to specify additional headers that should be exposed from the app, beyond the default set always recognized by Encore. If the list contains \"*\", then all headers are exposed.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "uniqueItems": true + }, + "allow_origins_without_credentials": { + "description": "AllowOriginsWithoutCredentials specifies the allowed origins for requests that don't include credentials. If nil it defaults to allowing all domains", + "type": "array", + "items": { + "type": "string" + }, + "default": [ + "*" + ], + "uniqueItems": true + }, + "allow_origins_with_credentials": { + "description": "AllowOriginsWithCredentials specifies the allowed origins for requests that include credentials. If a request is made from an Origin in this list Encore responds with Access-Control-Allow-Origin: . The URLs in this list may include wildcards (e.g. \"https://*.example.com\"or \"https://*-myapp.example.com\").", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "uniqueItems": true + } + } + } + } +} diff --git a/pkg/builder/builder.go b/pkg/builder/builder.go index 491a8dee3c..d978a6c08d 100644 --- a/pkg/builder/builder.go +++ b/pkg/builder/builder.go @@ -12,6 +12,7 @@ import ( "encore.dev/appruntime/exported/experiments" "encr.dev/cli/daemon/apps" "encr.dev/internal/optracker" + "encr.dev/pkg/appfile" "encr.dev/pkg/cueutil" "encr.dev/pkg/option" "encr.dev/pkg/paths" @@ -22,8 +23,7 @@ var LocalBuildTags = []string{"encore_local", "encore_no_gcp", "encore_no_aws", type BuildInfo struct { BuildTags []string - CgoEnabled bool - StaticLink bool + BuildConfig appfile.BuildCfg Debug bool GOOS, GOARCH string KeepOutput bool @@ -47,8 +47,7 @@ type BuildInfo struct { func DefaultBuildInfo() BuildInfo { return BuildInfo{ BuildTags: slices.Clone(LocalBuildTags), - CgoEnabled: true, - StaticLink: false, + BuildConfig: appfile.BuildCfg{}, Debug: false, GOOS: runtime.GOOS, GOARCH: runtime.GOARCH, diff --git a/pkg/errinsrc/srcrender.go b/pkg/errinsrc/srcrender.go index 1d5a6a9caf..989751d39c 100644 --- a/pkg/errinsrc/srcrender.go +++ b/pkg/errinsrc/srcrender.go @@ -33,6 +33,10 @@ func ColoursInErrors(enabled bool) { aurora = auroraPkg.NewAurora(enabled) } +func ColoursEnabled() bool { + return enableColors +} + // renderSrc returns the lines of code surrounding the location with a pointer to the error on the error line func renderSrc(builder *strings.Builder, causes SrcLocations) { const linesBeforeError = 2 @@ -334,9 +338,7 @@ func renderErrorText(builder *strings.Builder, startCol int, numDigitsInLineNumb // It's possible the start column references generated code; in that case reset // the column information as a fallback to prevent panics below. - if startCol > len(srcLine) { - startCol = 0 - } else { + if startCol <= len(srcLine) { // Compute the whitespace prefix we need on each line // (Note this will render tabs as tabs still if they are present) prefixWhitespace = strings.Repeat(" ", calcNumberCharactersForColumnNumber(srcLine, startCol-1)) diff --git a/pkg/errlist/errlist.go b/pkg/errlist/errlist.go index 7647d23481..2cb01f59b4 100644 --- a/pkg/errlist/errlist.go +++ b/pkg/errlist/errlist.go @@ -206,6 +206,10 @@ func (l *List) ErrorList() []*errinsrc.ErrInSrc { // app root relative to the relwd (which must be a relative path // within the root). func (l *List) MakeRelative(root, relwd string) { + if l == nil { + return + } + wdroot := filepath.Join(root, relwd) for _, e := range l.List { for _, loc := range e.Params.Locations { @@ -276,9 +280,9 @@ func (l *List) SendToStream(stream interface { func Print(w io.Writer, err error) { if l, ok := err.(*List); ok { for _, e := range l.List { - fmt.Fprintf(w, "%s\n", e) + _, _ = fmt.Fprintf(w, "%s\n", e) } } else if err != nil { - fmt.Fprintf(w, "%s\n", err) + _, _ = fmt.Fprintf(w, "%s\n", err) } } diff --git a/pkg/traceparser/parser.go b/pkg/traceparser/parser.go index 2c7763590e..7f749a6112 100644 --- a/pkg/traceparser/parser.go +++ b/pkg/traceparser/parser.go @@ -2,11 +2,11 @@ package traceparser import ( "bufio" - "errors" "fmt" "io" "runtime/debug" + "github.com/cockroachdb/errors" "github.com/rs/zerolog" "github.com/rs/zerolog/log" "google.golang.org/protobuf/types/known/timestamppb" @@ -137,6 +137,10 @@ func (tp *traceParser) parseEvent(h header) (ev *tracepb2.TraceEvent, err error) ev.Event = &tracepb2.TraceEvent_SpanStart{SpanStart: tp.testSpanStart()} case trace2.TestEnd: ev.Event = &tracepb2.TraceEvent_SpanEnd{SpanEnd: tp.testSpanEnd()} + case trace2.GenericSpanStart: + ev.Event = &tracepb2.TraceEvent_SpanStart{SpanStart: tp.genericSpanStart()} + case trace2.GenericSpanEnd: + ev.Event = &tracepb2.TraceEvent_SpanEnd{SpanEnd: tp.genericSpanEnd()} default: ev.Event = &tracepb2.TraceEvent_SpanEvent{SpanEvent: tp.spanEvent(h.Type)} } @@ -231,6 +235,8 @@ func (tp *traceParser) spanEvent(eventType trace2.EventType) *tracepb2.SpanEvent ev.Data = &tracepb2.SpanEvent_CacheCallStart{CacheCallStart: tp.cacheCallStart()} case trace2.CacheCallEnd: ev.Data = &tracepb2.SpanEvent_CacheCallEnd{CacheCallEnd: tp.cacheCallEnd()} + case trace2.GenericEvent: + ev.Data = &tracepb2.SpanEvent_GenericEvent{GenericEvent: tp.genericEvent()} case trace2.BodyStream: ev.Data = &tracepb2.SpanEvent_BodyStream{BodyStream: tp.bodyStream()} default: @@ -421,6 +427,46 @@ func (tp *traceParser) testSpanEnd() *tracepb2.SpanEnd { } } +func (tp *traceParser) genericSpanStart() *tracepb2.SpanStart { + spanStart := tp.spanStartEvent() + + return &tracepb2.SpanStart{ + Goid: spanStart.Goid, + ParentTraceId: spanStart.ParentTraceID.GetOrElse(nil), + ParentSpanId: spanStart.ParentSpanID.PtrOrNil(), + DefLoc: spanStart.DefLoc.PtrOrNil(), + CallerEventId: (*uint64)(spanStart.CallerEventID.PtrOrNil()), + ExternalCorrelationId: spanStart.ExtCorrelationID.PtrOrNil(), + Data: &tracepb2.SpanStart_Generic{ + Generic: &tracepb2.GenericSpanStart{ + SpanName: tp.String(), + Kind: tracepb2.GenericSpanStart_Kind(tp.Byte()), + Time: tp.Time(), + Attributes: tp.logFields(), + Stack: tp.stack(), + }, + }, + } +} + +func (tp *traceParser) genericSpanEnd() *tracepb2.SpanEnd { + spanEnd := tp.spanEndEvent() + return &tracepb2.SpanEnd{ + DurationNanos: spanEnd.DurationNanos, + Error: spanEnd.Err, + PanicStack: spanEnd.PanicStack.GetOrElse(nil), + ParentTraceId: spanEnd.ParentTraceID.GetOrElse(nil), + ParentSpanId: spanEnd.ParentSpanID.PtrOrNil(), + Data: &tracepb2.SpanEnd_Generic{ + Generic: &tracepb2.GenericSpanEnd{ + Time: tp.Time(), + Attributes: tp.logFields(), + Stack: tp.stack(), + }, + }, + } +} + func (tp *traceParser) rpcCallStart() *tracepb2.RPCCallStart { return &tracepb2.RPCCallStart{ TargetServiceName: tp.String(), @@ -559,6 +605,16 @@ func (tp *traceParser) cacheCallEnd() *tracepb2.CacheCallEnd { } } +func (tp *traceParser) genericEvent() *tracepb2.GenericEvent { + return &tracepb2.GenericEvent{ + EventName: tp.String(), + Time: tp.Time(), + Error: tp.errWithStack(), + Attributes: tp.logFields(), + Stack: tp.stack(), + } +} + func (tp *traceParser) bodyStream() *tracepb2.BodyStream { flags := tp.Byte() data := tp.ByteString() @@ -727,20 +783,22 @@ func (tp *traceParser) logMessage() *tracepb2.LogMessage { return tracepb2.LogMessage_TRACE } })(), - Msg: tp.String(), - Fields: (func() []*tracepb2.LogField { - n := int(tp.UVarint()) - if n > 64 { - // TODO bailout - } - fields := make([]*tracepb2.LogField, 0, n) - for i := 0; i < n; i++ { - fields = append(fields, tp.logField()) - } - return fields - })(), - Stack: tp.stack(), + Msg: tp.String(), + Fields: tp.logFields(), + Stack: tp.stack(), + } +} + +func (tp *traceParser) logFields() []*tracepb2.LogField { + n := int(tp.UVarint()) + if n > 64 { + tp.bailout(errors.Newf("too many log fields: %d", n)) + } + fields := make([]*tracepb2.LogField, 0, n) + for i := 0; i < n; i++ { + fields = append(fields, tp.logField()) } + return fields } func (tp *traceParser) logField() *tracepb2.LogField { diff --git a/proto/encore/engine/trace2/trace2.pb.go b/proto/encore/engine/trace2/trace2.pb.go index 3ce477a607..b342a680d8 100644 --- a/proto/encore/engine/trace2/trace2.pb.go +++ b/proto/encore/engine/trace2/trace2.pb.go @@ -114,6 +114,7 @@ const ( SpanSummary_AUTH SpanSummary_SpanType = 2 SpanSummary_PUBSUB_MESSAGE SpanSummary_SpanType = 3 SpanSummary_TEST SpanSummary_SpanType = 4 + SpanSummary_GENERIC_SPAN SpanSummary_SpanType = 5 ) // Enum value maps for SpanSummary_SpanType. @@ -124,6 +125,7 @@ var ( 2: "AUTH", 3: "PUBSUB_MESSAGE", 4: "TEST", + 5: "GENERIC_SPAN", } SpanSummary_SpanType_value = map[string]int32{ "UNKNOWN": 0, @@ -131,6 +133,7 @@ var ( "AUTH": 2, "PUBSUB_MESSAGE": 3, "TEST": 4, + "GENERIC_SPAN": 5, } ) @@ -161,6 +164,64 @@ func (SpanSummary_SpanType) EnumDescriptor() ([]byte, []int) { return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{0, 0} } +type GenericSpanStart_Kind int32 + +const ( + GenericSpanStart_UNKNOWN GenericSpanStart_Kind = 0 + GenericSpanStart_INTERNAL GenericSpanStart_Kind = 1 + GenericSpanStart_REQUEST GenericSpanStart_Kind = 2 + GenericSpanStart_CALL GenericSpanStart_Kind = 3 + GenericSpanStart_PRODUCER GenericSpanStart_Kind = 4 + GenericSpanStart_CONSUMER GenericSpanStart_Kind = 5 +) + +// Enum value maps for GenericSpanStart_Kind. +var ( + GenericSpanStart_Kind_name = map[int32]string{ + 0: "UNKNOWN", + 1: "INTERNAL", + 2: "REQUEST", + 3: "CALL", + 4: "PRODUCER", + 5: "CONSUMER", + } + GenericSpanStart_Kind_value = map[string]int32{ + "UNKNOWN": 0, + "INTERNAL": 1, + "REQUEST": 2, + "CALL": 3, + "PRODUCER": 4, + "CONSUMER": 5, + } +) + +func (x GenericSpanStart_Kind) Enum() *GenericSpanStart_Kind { + p := new(GenericSpanStart_Kind) + *p = x + return p +} + +func (x GenericSpanStart_Kind) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (GenericSpanStart_Kind) Descriptor() protoreflect.EnumDescriptor { + return file_encore_engine_trace2_trace2_proto_enumTypes[2].Descriptor() +} + +func (GenericSpanStart_Kind) Type() protoreflect.EnumType { + return &file_encore_engine_trace2_trace2_proto_enumTypes[2] +} + +func (x GenericSpanStart_Kind) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use GenericSpanStart_Kind.Descriptor instead. +func (GenericSpanStart_Kind) EnumDescriptor() ([]byte, []int) { + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{14, 0} +} + type DBTransactionEnd_CompletionType int32 const ( @@ -191,11 +252,11 @@ func (x DBTransactionEnd_CompletionType) String() string { } func (DBTransactionEnd_CompletionType) Descriptor() protoreflect.EnumDescriptor { - return file_encore_engine_trace2_trace2_proto_enumTypes[2].Descriptor() + return file_encore_engine_trace2_trace2_proto_enumTypes[3].Descriptor() } func (DBTransactionEnd_CompletionType) Type() protoreflect.EnumType { - return &file_encore_engine_trace2_trace2_proto_enumTypes[2] + return &file_encore_engine_trace2_trace2_proto_enumTypes[3] } func (x DBTransactionEnd_CompletionType) Number() protoreflect.EnumNumber { @@ -204,7 +265,7 @@ func (x DBTransactionEnd_CompletionType) Number() protoreflect.EnumNumber { // Deprecated: Use DBTransactionEnd_CompletionType.Descriptor instead. func (DBTransactionEnd_CompletionType) EnumDescriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{20, 0} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{22, 0} } type CacheCallEnd_Result int32 @@ -246,11 +307,11 @@ func (x CacheCallEnd_Result) String() string { } func (CacheCallEnd_Result) Descriptor() protoreflect.EnumDescriptor { - return file_encore_engine_trace2_trace2_proto_enumTypes[3].Descriptor() + return file_encore_engine_trace2_trace2_proto_enumTypes[4].Descriptor() } func (CacheCallEnd_Result) Type() protoreflect.EnumType { - return &file_encore_engine_trace2_trace2_proto_enumTypes[3] + return &file_encore_engine_trace2_trace2_proto_enumTypes[4] } func (x CacheCallEnd_Result) Number() protoreflect.EnumNumber { @@ -259,7 +320,7 @@ func (x CacheCallEnd_Result) Number() protoreflect.EnumNumber { // Deprecated: Use CacheCallEnd_Result.Descriptor instead. func (CacheCallEnd_Result) EnumDescriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{28, 0} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{30, 0} } // Note: These values don't match the values used by the binary trace protocol, @@ -305,11 +366,11 @@ func (x LogMessage_Level) String() string { } func (LogMessage_Level) Descriptor() protoreflect.EnumDescriptor { - return file_encore_engine_trace2_trace2_proto_enumTypes[4].Descriptor() + return file_encore_engine_trace2_trace2_proto_enumTypes[5].Descriptor() } func (LogMessage_Level) Type() protoreflect.EnumType { - return &file_encore_engine_trace2_trace2_proto_enumTypes[4] + return &file_encore_engine_trace2_trace2_proto_enumTypes[5] } func (x LogMessage_Level) Number() protoreflect.EnumNumber { @@ -318,7 +379,7 @@ func (x LogMessage_Level) Number() protoreflect.EnumNumber { // Deprecated: Use LogMessage_Level.Descriptor instead. func (LogMessage_Level) EnumDescriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{48, 0} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{51, 0} } // SpanSummary summarizes a span for display purposes. @@ -735,6 +796,7 @@ type SpanStart struct { // *SpanStart_Auth // *SpanStart_PubsubMessage // *SpanStart_Test + // *SpanStart_Generic Data isSpanStart_Data `protobuf_oneof:"data"` } @@ -847,6 +909,13 @@ func (x *SpanStart) GetTest() *TestSpanStart { return nil } +func (x *SpanStart) GetGeneric() *GenericSpanStart { + if x, ok := x.GetData().(*SpanStart_Generic); ok { + return x.Generic + } + return nil +} + type isSpanStart_Data interface { isSpanStart_Data() } @@ -867,6 +936,10 @@ type SpanStart_Test struct { Test *TestSpanStart `protobuf:"bytes,13,opt,name=test,proto3,oneof"` } +type SpanStart_Generic struct { + Generic *GenericSpanStart `protobuf:"bytes,14,opt,name=generic,proto3,oneof"` +} + func (*SpanStart_Request) isSpanStart_Data() {} func (*SpanStart_Auth) isSpanStart_Data() {} @@ -875,6 +948,8 @@ func (*SpanStart_PubsubMessage) isSpanStart_Data() {} func (*SpanStart_Test) isSpanStart_Data() {} +func (*SpanStart_Generic) isSpanStart_Data() {} + type SpanEnd struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -892,6 +967,7 @@ type SpanEnd struct { // *SpanEnd_Auth // *SpanEnd_PubsubMessage // *SpanEnd_Test + // *SpanEnd_Generic Data isSpanEnd_Data `protobuf_oneof:"data"` } @@ -997,6 +1073,13 @@ func (x *SpanEnd) GetTest() *TestSpanEnd { return nil } +func (x *SpanEnd) GetGeneric() *GenericSpanEnd { + if x, ok := x.GetData().(*SpanEnd_Generic); ok { + return x.Generic + } + return nil +} + type isSpanEnd_Data interface { isSpanEnd_Data() } @@ -1017,6 +1100,10 @@ type SpanEnd_Test struct { Test *TestSpanEnd `protobuf:"bytes,13,opt,name=test,proto3,oneof"` } +type SpanEnd_Generic struct { + Generic *GenericSpanEnd `protobuf:"bytes,14,opt,name=generic,proto3,oneof"` +} + func (*SpanEnd_Request) isSpanEnd_Data() {} func (*SpanEnd_Auth) isSpanEnd_Data() {} @@ -1025,6 +1112,8 @@ func (*SpanEnd_PubsubMessage) isSpanEnd_Data() {} func (*SpanEnd_Test) isSpanEnd_Data() {} +func (*SpanEnd_Generic) isSpanEnd_Data() {} + type RequestSpanStart struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1672,6 +1761,148 @@ func (x *TestSpanEnd) GetSkipped() bool { return false } +type GenericSpanStart struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SpanName string `protobuf:"bytes,1,opt,name=span_name,json=spanName,proto3" json:"span_name,omitempty"` + Kind GenericSpanStart_Kind `protobuf:"varint,2,opt,name=kind,proto3,enum=encore.engine.trace2.GenericSpanStart_Kind" json:"kind,omitempty"` + Time *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=time,proto3" json:"time,omitempty"` + Attributes []*LogField `protobuf:"bytes,4,rep,name=attributes,proto3" json:"attributes,omitempty"` + Stack *StackTrace `protobuf:"bytes,5,opt,name=stack,proto3" json:"stack,omitempty"` +} + +func (x *GenericSpanStart) Reset() { + *x = GenericSpanStart{} + if protoimpl.UnsafeEnabled { + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenericSpanStart) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenericSpanStart) ProtoMessage() {} + +func (x *GenericSpanStart) ProtoReflect() protoreflect.Message { + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenericSpanStart.ProtoReflect.Descriptor instead. +func (*GenericSpanStart) Descriptor() ([]byte, []int) { + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{14} +} + +func (x *GenericSpanStart) GetSpanName() string { + if x != nil { + return x.SpanName + } + return "" +} + +func (x *GenericSpanStart) GetKind() GenericSpanStart_Kind { + if x != nil { + return x.Kind + } + return GenericSpanStart_UNKNOWN +} + +func (x *GenericSpanStart) GetTime() *timestamppb.Timestamp { + if x != nil { + return x.Time + } + return nil +} + +func (x *GenericSpanStart) GetAttributes() []*LogField { + if x != nil { + return x.Attributes + } + return nil +} + +func (x *GenericSpanStart) GetStack() *StackTrace { + if x != nil { + return x.Stack + } + return nil +} + +type GenericSpanEnd struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Time *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=time,proto3" json:"time,omitempty"` + Attributes []*LogField `protobuf:"bytes,2,rep,name=attributes,proto3" json:"attributes,omitempty"` + Stack *StackTrace `protobuf:"bytes,3,opt,name=stack,proto3" json:"stack,omitempty"` +} + +func (x *GenericSpanEnd) Reset() { + *x = GenericSpanEnd{} + if protoimpl.UnsafeEnabled { + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenericSpanEnd) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenericSpanEnd) ProtoMessage() {} + +func (x *GenericSpanEnd) ProtoReflect() protoreflect.Message { + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenericSpanEnd.ProtoReflect.Descriptor instead. +func (*GenericSpanEnd) Descriptor() ([]byte, []int) { + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{15} +} + +func (x *GenericSpanEnd) GetTime() *timestamppb.Timestamp { + if x != nil { + return x.Time + } + return nil +} + +func (x *GenericSpanEnd) GetAttributes() []*LogField { + if x != nil { + return x.Attributes + } + return nil +} + +func (x *GenericSpanEnd) GetStack() *StackTrace { + if x != nil { + return x.Stack + } + return nil +} + type SpanEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1700,13 +1931,14 @@ type SpanEvent struct { // *SpanEvent_CacheCallEnd // *SpanEvent_ServiceInitStart // *SpanEvent_ServiceInitEnd + // *SpanEvent_GenericEvent Data isSpanEvent_Data `protobuf_oneof:"data"` } func (x *SpanEvent) Reset() { *x = SpanEvent{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[14] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1719,7 +1951,7 @@ func (x *SpanEvent) String() string { func (*SpanEvent) ProtoMessage() {} func (x *SpanEvent) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[14] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1732,7 +1964,7 @@ func (x *SpanEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use SpanEvent.ProtoReflect.Descriptor instead. func (*SpanEvent) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{14} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{16} } func (x *SpanEvent) GetGoid() uint32 { @@ -1875,6 +2107,13 @@ func (x *SpanEvent) GetServiceInitEnd() *ServiceInitEnd { return nil } +func (x *SpanEvent) GetGenericEvent() *GenericEvent { + if x, ok := x.GetData().(*SpanEvent_GenericEvent); ok { + return x.GenericEvent + } + return nil +} + type isSpanEvent_Data interface { isSpanEvent_Data() } @@ -1943,6 +2182,10 @@ type SpanEvent_ServiceInitEnd struct { ServiceInitEnd *ServiceInitEnd `protobuf:"bytes,25,opt,name=service_init_end,json=serviceInitEnd,proto3,oneof"` } +type SpanEvent_GenericEvent struct { + GenericEvent *GenericEvent `protobuf:"bytes,26,opt,name=generic_event,json=genericEvent,proto3,oneof"` +} + func (*SpanEvent_LogMessage) isSpanEvent_Data() {} func (*SpanEvent_BodyStream) isSpanEvent_Data() {} @@ -1975,6 +2218,8 @@ func (*SpanEvent_ServiceInitStart) isSpanEvent_Data() {} func (*SpanEvent_ServiceInitEnd) isSpanEvent_Data() {} +func (*SpanEvent_GenericEvent) isSpanEvent_Data() {} + type RPCCallStart struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1988,7 +2233,7 @@ type RPCCallStart struct { func (x *RPCCallStart) Reset() { *x = RPCCallStart{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[15] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2001,7 +2246,7 @@ func (x *RPCCallStart) String() string { func (*RPCCallStart) ProtoMessage() {} func (x *RPCCallStart) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[15] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2014,7 +2259,7 @@ func (x *RPCCallStart) ProtoReflect() protoreflect.Message { // Deprecated: Use RPCCallStart.ProtoReflect.Descriptor instead. func (*RPCCallStart) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{15} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{17} } func (x *RPCCallStart) GetTargetServiceName() string { @@ -2049,7 +2294,7 @@ type RPCCallEnd struct { func (x *RPCCallEnd) Reset() { *x = RPCCallEnd{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[16] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2062,7 +2307,7 @@ func (x *RPCCallEnd) String() string { func (*RPCCallEnd) ProtoMessage() {} func (x *RPCCallEnd) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[16] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2075,7 +2320,7 @@ func (x *RPCCallEnd) ProtoReflect() protoreflect.Message { // Deprecated: Use RPCCallEnd.ProtoReflect.Descriptor instead. func (*RPCCallEnd) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{16} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{18} } func (x *RPCCallEnd) GetErr() *Error { @@ -2094,7 +2339,7 @@ type GoroutineStart struct { func (x *GoroutineStart) Reset() { *x = GoroutineStart{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[17] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2107,7 +2352,7 @@ func (x *GoroutineStart) String() string { func (*GoroutineStart) ProtoMessage() {} func (x *GoroutineStart) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[17] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2120,7 +2365,7 @@ func (x *GoroutineStart) ProtoReflect() protoreflect.Message { // Deprecated: Use GoroutineStart.ProtoReflect.Descriptor instead. func (*GoroutineStart) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{17} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{19} } type GoroutineEnd struct { @@ -2132,7 +2377,7 @@ type GoroutineEnd struct { func (x *GoroutineEnd) Reset() { *x = GoroutineEnd{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[18] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2145,7 +2390,7 @@ func (x *GoroutineEnd) String() string { func (*GoroutineEnd) ProtoMessage() {} func (x *GoroutineEnd) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[18] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2158,7 +2403,7 @@ func (x *GoroutineEnd) ProtoReflect() protoreflect.Message { // Deprecated: Use GoroutineEnd.ProtoReflect.Descriptor instead. func (*GoroutineEnd) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{18} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{20} } type DBTransactionStart struct { @@ -2172,7 +2417,7 @@ type DBTransactionStart struct { func (x *DBTransactionStart) Reset() { *x = DBTransactionStart{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[19] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2185,7 +2430,7 @@ func (x *DBTransactionStart) String() string { func (*DBTransactionStart) ProtoMessage() {} func (x *DBTransactionStart) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[19] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2198,7 +2443,7 @@ func (x *DBTransactionStart) ProtoReflect() protoreflect.Message { // Deprecated: Use DBTransactionStart.ProtoReflect.Descriptor instead. func (*DBTransactionStart) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{19} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{21} } func (x *DBTransactionStart) GetStack() *StackTrace { @@ -2221,7 +2466,7 @@ type DBTransactionEnd struct { func (x *DBTransactionEnd) Reset() { *x = DBTransactionEnd{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[20] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2234,7 +2479,7 @@ func (x *DBTransactionEnd) String() string { func (*DBTransactionEnd) ProtoMessage() {} func (x *DBTransactionEnd) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[20] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2247,7 +2492,7 @@ func (x *DBTransactionEnd) ProtoReflect() protoreflect.Message { // Deprecated: Use DBTransactionEnd.ProtoReflect.Descriptor instead. func (*DBTransactionEnd) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{20} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{22} } func (x *DBTransactionEnd) GetCompletion() DBTransactionEnd_CompletionType { @@ -2283,7 +2528,7 @@ type DBQueryStart struct { func (x *DBQueryStart) Reset() { *x = DBQueryStart{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[21] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2296,7 +2541,7 @@ func (x *DBQueryStart) String() string { func (*DBQueryStart) ProtoMessage() {} func (x *DBQueryStart) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[21] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2309,7 +2554,7 @@ func (x *DBQueryStart) ProtoReflect() protoreflect.Message { // Deprecated: Use DBQueryStart.ProtoReflect.Descriptor instead. func (*DBQueryStart) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{21} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{23} } func (x *DBQueryStart) GetQuery() string { @@ -2337,7 +2582,7 @@ type DBQueryEnd struct { func (x *DBQueryEnd) Reset() { *x = DBQueryEnd{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[22] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2350,7 +2595,7 @@ func (x *DBQueryEnd) String() string { func (*DBQueryEnd) ProtoMessage() {} func (x *DBQueryEnd) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[22] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2363,7 +2608,7 @@ func (x *DBQueryEnd) ProtoReflect() protoreflect.Message { // Deprecated: Use DBQueryEnd.ProtoReflect.Descriptor instead. func (*DBQueryEnd) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{22} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{24} } func (x *DBQueryEnd) GetErr() *Error { @@ -2386,7 +2631,7 @@ type PubsubPublishStart struct { func (x *PubsubPublishStart) Reset() { *x = PubsubPublishStart{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[23] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2399,7 +2644,7 @@ func (x *PubsubPublishStart) String() string { func (*PubsubPublishStart) ProtoMessage() {} func (x *PubsubPublishStart) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[23] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2412,7 +2657,7 @@ func (x *PubsubPublishStart) ProtoReflect() protoreflect.Message { // Deprecated: Use PubsubPublishStart.ProtoReflect.Descriptor instead. func (*PubsubPublishStart) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{23} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{25} } func (x *PubsubPublishStart) GetTopic() string { @@ -2448,7 +2693,7 @@ type PubsubPublishEnd struct { func (x *PubsubPublishEnd) Reset() { *x = PubsubPublishEnd{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[24] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2461,7 +2706,7 @@ func (x *PubsubPublishEnd) String() string { func (*PubsubPublishEnd) ProtoMessage() {} func (x *PubsubPublishEnd) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[24] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2474,7 +2719,7 @@ func (x *PubsubPublishEnd) ProtoReflect() protoreflect.Message { // Deprecated: Use PubsubPublishEnd.ProtoReflect.Descriptor instead. func (*PubsubPublishEnd) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{24} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{26} } func (x *PubsubPublishEnd) GetMessageId() string { @@ -2502,7 +2747,7 @@ type ServiceInitStart struct { func (x *ServiceInitStart) Reset() { *x = ServiceInitStart{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[25] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2515,7 +2760,7 @@ func (x *ServiceInitStart) String() string { func (*ServiceInitStart) ProtoMessage() {} func (x *ServiceInitStart) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[25] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2528,7 +2773,7 @@ func (x *ServiceInitStart) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceInitStart.ProtoReflect.Descriptor instead. func (*ServiceInitStart) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{25} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{27} } func (x *ServiceInitStart) GetService() string { @@ -2549,7 +2794,7 @@ type ServiceInitEnd struct { func (x *ServiceInitEnd) Reset() { *x = ServiceInitEnd{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[26] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2562,7 +2807,7 @@ func (x *ServiceInitEnd) String() string { func (*ServiceInitEnd) ProtoMessage() {} func (x *ServiceInitEnd) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[26] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2575,7 +2820,7 @@ func (x *ServiceInitEnd) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceInitEnd.ProtoReflect.Descriptor instead. func (*ServiceInitEnd) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{26} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{28} } func (x *ServiceInitEnd) GetErr() *Error { @@ -2599,7 +2844,7 @@ type CacheCallStart struct { func (x *CacheCallStart) Reset() { *x = CacheCallStart{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[27] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2612,7 +2857,7 @@ func (x *CacheCallStart) String() string { func (*CacheCallStart) ProtoMessage() {} func (x *CacheCallStart) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[27] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2625,7 +2870,7 @@ func (x *CacheCallStart) ProtoReflect() protoreflect.Message { // Deprecated: Use CacheCallStart.ProtoReflect.Descriptor instead. func (*CacheCallStart) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{27} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{29} } func (x *CacheCallStart) GetOperation() string { @@ -2668,7 +2913,7 @@ type CacheCallEnd struct { func (x *CacheCallEnd) Reset() { *x = CacheCallEnd{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[28] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2681,7 +2926,7 @@ func (x *CacheCallEnd) String() string { func (*CacheCallEnd) ProtoMessage() {} func (x *CacheCallEnd) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[28] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2694,7 +2939,7 @@ func (x *CacheCallEnd) ProtoReflect() protoreflect.Message { // Deprecated: Use CacheCallEnd.ProtoReflect.Descriptor instead. func (*CacheCallEnd) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{28} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{30} } func (x *CacheCallEnd) GetResult() CacheCallEnd_Result { @@ -2711,20 +2956,99 @@ func (x *CacheCallEnd) GetErr() *Error { return nil } -type BodyStream struct { +type GenericEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - IsResponse bool `protobuf:"varint,1,opt,name=is_response,json=isResponse,proto3" json:"is_response,omitempty"` - Overflowed bool `protobuf:"varint,2,opt,name=overflowed,proto3" json:"overflowed,omitempty"` + EventName string `protobuf:"bytes,1,opt,name=event_name,json=eventName,proto3" json:"event_name,omitempty"` + Time *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=time,proto3" json:"time,omitempty"` + Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + Attributes []*LogField `protobuf:"bytes,4,rep,name=attributes,proto3" json:"attributes,omitempty"` + Stack *StackTrace `protobuf:"bytes,5,opt,name=stack,proto3" json:"stack,omitempty"` +} + +func (x *GenericEvent) Reset() { + *x = GenericEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenericEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenericEvent) ProtoMessage() {} + +func (x *GenericEvent) ProtoReflect() protoreflect.Message { + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenericEvent.ProtoReflect.Descriptor instead. +func (*GenericEvent) Descriptor() ([]byte, []int) { + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{31} +} + +func (x *GenericEvent) GetEventName() string { + if x != nil { + return x.EventName + } + return "" +} + +func (x *GenericEvent) GetTime() *timestamppb.Timestamp { + if x != nil { + return x.Time + } + return nil +} + +func (x *GenericEvent) GetError() *Error { + if x != nil { + return x.Error + } + return nil +} + +func (x *GenericEvent) GetAttributes() []*LogField { + if x != nil { + return x.Attributes + } + return nil +} + +func (x *GenericEvent) GetStack() *StackTrace { + if x != nil { + return x.Stack + } + return nil +} + +type BodyStream struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IsResponse bool `protobuf:"varint,1,opt,name=is_response,json=isResponse,proto3" json:"is_response,omitempty"` + Overflowed bool `protobuf:"varint,2,opt,name=overflowed,proto3" json:"overflowed,omitempty"` Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` } func (x *BodyStream) Reset() { *x = BodyStream{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[29] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2737,7 +3061,7 @@ func (x *BodyStream) String() string { func (*BodyStream) ProtoMessage() {} func (x *BodyStream) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[29] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2750,7 +3074,7 @@ func (x *BodyStream) ProtoReflect() protoreflect.Message { // Deprecated: Use BodyStream.ProtoReflect.Descriptor instead. func (*BodyStream) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{29} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{32} } func (x *BodyStream) GetIsResponse() bool { @@ -2791,7 +3115,7 @@ type HTTPCallStart struct { func (x *HTTPCallStart) Reset() { *x = HTTPCallStart{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[30] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2804,7 +3128,7 @@ func (x *HTTPCallStart) String() string { func (*HTTPCallStart) ProtoMessage() {} func (x *HTTPCallStart) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[30] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2817,7 +3141,7 @@ func (x *HTTPCallStart) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPCallStart.ProtoReflect.Descriptor instead. func (*HTTPCallStart) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{30} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{33} } func (x *HTTPCallStart) GetCorrelationParentSpanId() uint64 { @@ -2871,7 +3195,7 @@ type HTTPCallEnd struct { func (x *HTTPCallEnd) Reset() { *x = HTTPCallEnd{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[31] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2884,7 +3208,7 @@ func (x *HTTPCallEnd) String() string { func (*HTTPCallEnd) ProtoMessage() {} func (x *HTTPCallEnd) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[31] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2897,7 +3221,7 @@ func (x *HTTPCallEnd) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPCallEnd.ProtoReflect.Descriptor instead. func (*HTTPCallEnd) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{31} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{34} } func (x *HTTPCallEnd) GetStatusCode() uint32 { @@ -2949,7 +3273,7 @@ type HTTPTraceEvent struct { func (x *HTTPTraceEvent) Reset() { *x = HTTPTraceEvent{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[32] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2962,7 +3286,7 @@ func (x *HTTPTraceEvent) String() string { func (*HTTPTraceEvent) ProtoMessage() {} func (x *HTTPTraceEvent) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[32] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2975,7 +3299,7 @@ func (x *HTTPTraceEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPTraceEvent.ProtoReflect.Descriptor instead. func (*HTTPTraceEvent) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{32} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{35} } func (x *HTTPTraceEvent) GetNanotime() int64 { @@ -3189,7 +3513,7 @@ type HTTPGetConn struct { func (x *HTTPGetConn) Reset() { *x = HTTPGetConn{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[33] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3202,7 +3526,7 @@ func (x *HTTPGetConn) String() string { func (*HTTPGetConn) ProtoMessage() {} func (x *HTTPGetConn) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[33] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3215,7 +3539,7 @@ func (x *HTTPGetConn) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPGetConn.ProtoReflect.Descriptor instead. func (*HTTPGetConn) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{33} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{36} } func (x *HTTPGetConn) GetHostPort() string { @@ -3238,7 +3562,7 @@ type HTTPGotConn struct { func (x *HTTPGotConn) Reset() { *x = HTTPGotConn{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[34] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3251,7 +3575,7 @@ func (x *HTTPGotConn) String() string { func (*HTTPGotConn) ProtoMessage() {} func (x *HTTPGotConn) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[34] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3264,7 +3588,7 @@ func (x *HTTPGotConn) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPGotConn.ProtoReflect.Descriptor instead. func (*HTTPGotConn) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{34} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{37} } func (x *HTTPGotConn) GetReused() bool { @@ -3297,7 +3621,7 @@ type HTTPGotFirstResponseByte struct { func (x *HTTPGotFirstResponseByte) Reset() { *x = HTTPGotFirstResponseByte{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[35] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3310,7 +3634,7 @@ func (x *HTTPGotFirstResponseByte) String() string { func (*HTTPGotFirstResponseByte) ProtoMessage() {} func (x *HTTPGotFirstResponseByte) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[35] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3323,7 +3647,7 @@ func (x *HTTPGotFirstResponseByte) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPGotFirstResponseByte.ProtoReflect.Descriptor instead. func (*HTTPGotFirstResponseByte) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{35} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{38} } type HTTPGot1XxResponse struct { @@ -3337,7 +3661,7 @@ type HTTPGot1XxResponse struct { func (x *HTTPGot1XxResponse) Reset() { *x = HTTPGot1XxResponse{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[36] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3350,7 +3674,7 @@ func (x *HTTPGot1XxResponse) String() string { func (*HTTPGot1XxResponse) ProtoMessage() {} func (x *HTTPGot1XxResponse) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[36] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3363,7 +3687,7 @@ func (x *HTTPGot1XxResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPGot1XxResponse.ProtoReflect.Descriptor instead. func (*HTTPGot1XxResponse) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{36} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{39} } func (x *HTTPGot1XxResponse) GetCode() int32 { @@ -3384,7 +3708,7 @@ type HTTPDNSStart struct { func (x *HTTPDNSStart) Reset() { *x = HTTPDNSStart{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[37] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3397,7 +3721,7 @@ func (x *HTTPDNSStart) String() string { func (*HTTPDNSStart) ProtoMessage() {} func (x *HTTPDNSStart) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[37] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3410,7 +3734,7 @@ func (x *HTTPDNSStart) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPDNSStart.ProtoReflect.Descriptor instead. func (*HTTPDNSStart) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{37} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{40} } func (x *HTTPDNSStart) GetHost() string { @@ -3432,7 +3756,7 @@ type HTTPDNSDone struct { func (x *HTTPDNSDone) Reset() { *x = HTTPDNSDone{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[38] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3445,7 +3769,7 @@ func (x *HTTPDNSDone) String() string { func (*HTTPDNSDone) ProtoMessage() {} func (x *HTTPDNSDone) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[38] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3458,7 +3782,7 @@ func (x *HTTPDNSDone) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPDNSDone.ProtoReflect.Descriptor instead. func (*HTTPDNSDone) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{38} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{41} } func (x *HTTPDNSDone) GetErr() []byte { @@ -3486,7 +3810,7 @@ type DNSAddr struct { func (x *DNSAddr) Reset() { *x = DNSAddr{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[39] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3499,7 +3823,7 @@ func (x *DNSAddr) String() string { func (*DNSAddr) ProtoMessage() {} func (x *DNSAddr) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[39] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3512,7 +3836,7 @@ func (x *DNSAddr) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSAddr.ProtoReflect.Descriptor instead. func (*DNSAddr) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{39} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{42} } func (x *DNSAddr) GetIp() []byte { @@ -3534,7 +3858,7 @@ type HTTPConnectStart struct { func (x *HTTPConnectStart) Reset() { *x = HTTPConnectStart{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[40] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3547,7 +3871,7 @@ func (x *HTTPConnectStart) String() string { func (*HTTPConnectStart) ProtoMessage() {} func (x *HTTPConnectStart) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[40] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3560,7 +3884,7 @@ func (x *HTTPConnectStart) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPConnectStart.ProtoReflect.Descriptor instead. func (*HTTPConnectStart) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{40} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{43} } func (x *HTTPConnectStart) GetNetwork() string { @@ -3590,7 +3914,7 @@ type HTTPConnectDone struct { func (x *HTTPConnectDone) Reset() { *x = HTTPConnectDone{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[41] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3603,7 +3927,7 @@ func (x *HTTPConnectDone) String() string { func (*HTTPConnectDone) ProtoMessage() {} func (x *HTTPConnectDone) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[41] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3616,7 +3940,7 @@ func (x *HTTPConnectDone) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPConnectDone.ProtoReflect.Descriptor instead. func (*HTTPConnectDone) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{41} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{44} } func (x *HTTPConnectDone) GetNetwork() string { @@ -3649,7 +3973,7 @@ type HTTPTLSHandshakeStart struct { func (x *HTTPTLSHandshakeStart) Reset() { *x = HTTPTLSHandshakeStart{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[42] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3662,7 +3986,7 @@ func (x *HTTPTLSHandshakeStart) String() string { func (*HTTPTLSHandshakeStart) ProtoMessage() {} func (x *HTTPTLSHandshakeStart) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[42] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3675,7 +3999,7 @@ func (x *HTTPTLSHandshakeStart) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPTLSHandshakeStart.ProtoReflect.Descriptor instead. func (*HTTPTLSHandshakeStart) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{42} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{45} } type HTTPTLSHandshakeDone struct { @@ -3693,7 +4017,7 @@ type HTTPTLSHandshakeDone struct { func (x *HTTPTLSHandshakeDone) Reset() { *x = HTTPTLSHandshakeDone{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[43] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3706,7 +4030,7 @@ func (x *HTTPTLSHandshakeDone) String() string { func (*HTTPTLSHandshakeDone) ProtoMessage() {} func (x *HTTPTLSHandshakeDone) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[43] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3719,7 +4043,7 @@ func (x *HTTPTLSHandshakeDone) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPTLSHandshakeDone.ProtoReflect.Descriptor instead. func (*HTTPTLSHandshakeDone) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{43} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{46} } func (x *HTTPTLSHandshakeDone) GetErr() []byte { @@ -3766,7 +4090,7 @@ type HTTPWroteHeaders struct { func (x *HTTPWroteHeaders) Reset() { *x = HTTPWroteHeaders{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[44] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3779,7 +4103,7 @@ func (x *HTTPWroteHeaders) String() string { func (*HTTPWroteHeaders) ProtoMessage() {} func (x *HTTPWroteHeaders) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[44] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3792,7 +4116,7 @@ func (x *HTTPWroteHeaders) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPWroteHeaders.ProtoReflect.Descriptor instead. func (*HTTPWroteHeaders) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{44} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{47} } type HTTPWroteRequest struct { @@ -3806,7 +4130,7 @@ type HTTPWroteRequest struct { func (x *HTTPWroteRequest) Reset() { *x = HTTPWroteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[45] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3819,7 +4143,7 @@ func (x *HTTPWroteRequest) String() string { func (*HTTPWroteRequest) ProtoMessage() {} func (x *HTTPWroteRequest) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[45] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3832,7 +4156,7 @@ func (x *HTTPWroteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPWroteRequest.ProtoReflect.Descriptor instead. func (*HTTPWroteRequest) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{45} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{48} } func (x *HTTPWroteRequest) GetErr() []byte { @@ -3851,7 +4175,7 @@ type HTTPWait100Continue struct { func (x *HTTPWait100Continue) Reset() { *x = HTTPWait100Continue{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[46] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3864,7 +4188,7 @@ func (x *HTTPWait100Continue) String() string { func (*HTTPWait100Continue) ProtoMessage() {} func (x *HTTPWait100Continue) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[46] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3877,7 +4201,7 @@ func (x *HTTPWait100Continue) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPWait100Continue.ProtoReflect.Descriptor instead. func (*HTTPWait100Continue) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{46} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{49} } type HTTPClosedBodyData struct { @@ -3891,7 +4215,7 @@ type HTTPClosedBodyData struct { func (x *HTTPClosedBodyData) Reset() { *x = HTTPClosedBodyData{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[47] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3904,7 +4228,7 @@ func (x *HTTPClosedBodyData) String() string { func (*HTTPClosedBodyData) ProtoMessage() {} func (x *HTTPClosedBodyData) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[47] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3917,7 +4241,7 @@ func (x *HTTPClosedBodyData) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPClosedBodyData.ProtoReflect.Descriptor instead. func (*HTTPClosedBodyData) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{47} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{50} } func (x *HTTPClosedBodyData) GetErr() []byte { @@ -3941,7 +4265,7 @@ type LogMessage struct { func (x *LogMessage) Reset() { *x = LogMessage{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[48] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3954,7 +4278,7 @@ func (x *LogMessage) String() string { func (*LogMessage) ProtoMessage() {} func (x *LogMessage) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[48] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3967,7 +4291,7 @@ func (x *LogMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use LogMessage.ProtoReflect.Descriptor instead. func (*LogMessage) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{48} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{51} } func (x *LogMessage) GetLevel() LogMessage_Level { @@ -4023,7 +4347,7 @@ type LogField struct { func (x *LogField) Reset() { *x = LogField{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[49] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4036,7 +4360,7 @@ func (x *LogField) String() string { func (*LogField) ProtoMessage() {} func (x *LogField) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[49] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4049,7 +4373,7 @@ func (x *LogField) ProtoReflect() protoreflect.Message { // Deprecated: Use LogField.ProtoReflect.Descriptor instead. func (*LogField) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{49} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{52} } func (x *LogField) GetKey() string { @@ -4225,7 +4549,7 @@ type StackTrace struct { func (x *StackTrace) Reset() { *x = StackTrace{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[50] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4238,7 +4562,7 @@ func (x *StackTrace) String() string { func (*StackTrace) ProtoMessage() {} func (x *StackTrace) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[50] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4251,7 +4575,7 @@ func (x *StackTrace) ProtoReflect() protoreflect.Message { // Deprecated: Use StackTrace.ProtoReflect.Descriptor instead. func (*StackTrace) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{50} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{53} } func (x *StackTrace) GetPcs() []int64 { @@ -4281,7 +4605,7 @@ type StackFrame struct { func (x *StackFrame) Reset() { *x = StackFrame{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[51] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4294,7 +4618,7 @@ func (x *StackFrame) String() string { func (*StackFrame) ProtoMessage() {} func (x *StackFrame) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[51] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4307,7 +4631,7 @@ func (x *StackFrame) ProtoReflect() protoreflect.Message { // Deprecated: Use StackFrame.ProtoReflect.Descriptor instead. func (*StackFrame) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{51} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{54} } func (x *StackFrame) GetFilename() string { @@ -4343,7 +4667,7 @@ type Error struct { func (x *Error) Reset() { *x = Error{} if protoimpl.UnsafeEnabled { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[52] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4356,7 +4680,7 @@ func (x *Error) String() string { func (*Error) ProtoMessage() {} func (x *Error) ProtoReflect() protoreflect.Message { - mi := &file_encore_engine_trace2_trace2_proto_msgTypes[52] + mi := &file_encore_engine_trace2_trace2_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4369,7 +4693,7 @@ func (x *Error) ProtoReflect() protoreflect.Message { // Deprecated: Use Error.ProtoReflect.Descriptor instead. func (*Error) Descriptor() ([]byte, []int) { - return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{52} + return file_encore_engine_trace2_trace2_proto_rawDescGZIP(), []int{55} } func (x *Error) GetMsg() string { @@ -4394,7 +4718,7 @@ var file_encore_engine_trace2_trace2_proto_rawDesc = []byte{ 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xae, 0x06, 0x0a, 0x0b, 0x53, + 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc0, 0x06, 0x0a, 0x0b, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64, @@ -4433,681 +4757,747 @@ var file_encore_engine_trace2_trace2_proto_rawDesc = []byte{ 0x73, 0x72, 0x63, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x07, 0x73, 0x72, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x06, - 0x52, 0x07, 0x73, 0x72, 0x63, 0x4c, 0x69, 0x6e, 0x65, 0x88, 0x01, 0x01, 0x22, 0x4c, 0x0a, 0x08, + 0x52, 0x07, 0x73, 0x72, 0x63, 0x4c, 0x69, 0x6e, 0x65, 0x88, 0x01, 0x01, 0x22, 0x5e, 0x0a, 0x08, 0x53, 0x70, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x55, 0x54, 0x48, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x55, 0x42, 0x53, 0x55, 0x42, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x03, - 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x53, 0x54, 0x10, 0x04, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, - 0x5f, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, - 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, - 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, - 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x73, 0x72, 0x63, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x0b, - 0x0a, 0x09, 0x5f, 0x73, 0x72, 0x63, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x2f, 0x0a, 0x07, 0x54, - 0x72, 0x61, 0x63, 0x65, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x69, 0x67, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x68, 0x69, 0x67, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, - 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6c, 0x6f, 0x77, 0x22, 0x45, 0x0a, 0x09, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, - 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0xfe, 0x02, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x54, 0x72, 0x61, 0x63, - 0x65, 0x49, 0x44, 0x52, 0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, - 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, - 0x70, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0a, 0x73, - 0x70, 0x61, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x53, 0x54, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x47, 0x45, + 0x4e, 0x45, 0x52, 0x49, 0x43, 0x5f, 0x53, 0x50, 0x41, 0x4e, 0x10, 0x05, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0d, + 0x0a, 0x0b, 0x5f, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x14, 0x0a, + 0x12, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, + 0x69, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6b, 0x69, 0x70, + 0x70, 0x65, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x73, 0x72, 0x63, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x73, 0x72, 0x63, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x2f, 0x0a, + 0x07, 0x54, 0x72, 0x61, 0x63, 0x65, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x69, 0x67, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x68, 0x69, 0x67, 0x68, 0x12, 0x10, 0x0a, 0x03, + 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6c, 0x6f, 0x77, 0x22, 0x45, + 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x06, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x32, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xfe, 0x02, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x54, 0x72, + 0x61, 0x63, 0x65, 0x49, 0x44, 0x52, 0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x17, + 0x0a, 0x07, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x06, 0x73, 0x70, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, + 0x0a, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x48, 0x00, 0x52, 0x09, 0x73, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, + 0x3a, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, + 0x48, 0x00, 0x52, 0x07, 0x73, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x73, + 0x70, 0x61, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, - 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x48, 0x00, 0x52, 0x09, 0x73, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x3a, 0x0a, - 0x08, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, - 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x48, 0x00, - 0x52, 0x07, 0x73, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x73, 0x70, 0x61, - 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, - 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x09, 0x73, 0x70, 0x61, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x22, 0x9a, 0x05, 0x0a, 0x09, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x6f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x67, 0x6f, 0x69, 0x64, 0x12, 0x4a, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, - 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x49, 0x44, 0x48, 0x01, - 0x52, 0x0d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x70, 0x61, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x0c, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, - 0x0f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x03, 0x52, 0x0d, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x65, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x15, 0x65, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x5f, 0x6c, - 0x6f, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x05, 0x52, 0x06, 0x64, 0x65, 0x66, 0x4c, - 0x6f, 0x63, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, - 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x04, 0x61, 0x75, 0x74, - 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x41, - 0x75, 0x74, 0x68, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x04, - 0x61, 0x75, 0x74, 0x68, 0x12, 0x55, 0x0a, 0x0e, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x5f, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x65, - 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, - 0x63, 0x65, 0x32, 0x2e, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x75, - 0x62, 0x73, 0x75, 0x62, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x04, 0x74, - 0x65, 0x73, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, 0x63, 0x6f, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x09, 0x73, 0x70, 0x61, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, + 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xde, 0x05, 0x0a, 0x09, 0x53, 0x70, 0x61, 0x6e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x6f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x67, 0x6f, 0x69, 0x64, 0x12, 0x4a, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x49, 0x44, + 0x48, 0x01, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x63, 0x65, 0x49, + 0x64, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x0c, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x2b, 0x0a, 0x0f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x03, 0x52, 0x0d, 0x63, 0x61, 0x6c, 0x6c, + 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, + 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, 0x65, 0x66, + 0x5f, 0x6c, 0x6f, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x05, 0x52, 0x06, 0x64, 0x65, + 0x66, 0x4c, 0x6f, 0x63, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x48, 0x00, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x04, 0x61, + 0x75, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, - 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, - 0x52, 0x04, 0x74, 0x65, 0x73, 0x74, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x42, 0x12, - 0x0a, 0x10, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x70, - 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, - 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x65, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x5f, 0x6c, 0x6f, - 0x63, 0x22, 0xf9, 0x04, 0x0a, 0x07, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x12, 0x25, 0x0a, - 0x0e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x36, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x48, 0x01, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x0b, - 0x70, 0x61, 0x6e, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, - 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, - 0x61, 0x63, 0x65, 0x48, 0x02, 0x52, 0x0a, 0x70, 0x61, 0x6e, 0x69, 0x63, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, - 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, - 0x61, 0x63, 0x65, 0x32, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x49, 0x44, 0x48, 0x03, 0x52, 0x0d, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, - 0x12, 0x29, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, - 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, - 0x63, 0x65, 0x32, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x45, - 0x6e, 0x64, 0x48, 0x00, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, - 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, - 0x65, 0x32, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x48, 0x00, - 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x12, 0x53, 0x0a, 0x0e, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, - 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, + 0x2e, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, + 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x12, 0x55, 0x0a, 0x0e, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x75, - 0x62, 0x73, 0x75, 0x62, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x74, - 0x65, 0x73, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, 0x63, 0x6f, + 0x61, 0x67, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0d, + 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x39, 0x0a, + 0x04, 0x74, 0x65, 0x73, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x32, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x48, 0x00, 0x52, 0x04, 0x74, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x07, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x69, 0x63, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, - 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, - 0x74, 0x65, 0x73, 0x74, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x42, 0x08, 0x0a, 0x06, - 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x6e, 0x69, 0x63, - 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x9b, 0x04, - 0x0a, 0x10, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x74, - 0x74, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x68, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, - 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x74, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x63, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x63, 0x6f, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x48, 0x00, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x42, 0x06, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x12, 0x0a, 0x10, 0x5f, + 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x42, + 0x1a, 0x0a, 0x18, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f, + 0x64, 0x65, 0x66, 0x5f, 0x6c, 0x6f, 0x63, 0x22, 0xbb, 0x05, 0x0a, 0x07, 0x53, 0x70, 0x61, 0x6e, + 0x45, 0x6e, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x64, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x36, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, - 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x01, 0x52, 0x10, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x03, 0x75, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, - 0x06, 0x6d, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6d, - 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x1a, 0x41, 0x0a, 0x13, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x15, 0x0a, 0x13, - 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x75, 0x69, 0x64, 0x22, 0xf1, 0x02, 0x0a, 0x0e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0e, 0x68, 0x74, 0x74, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x64, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x65, 0x6e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, - 0x32, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, - 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x48, 0x00, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x88, 0x01, 0x01, 0x1a, 0x42, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, - 0x90, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x61, 0x75, 0x74, - 0x68, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, - 0x00, 0x52, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x88, 0x01, - 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x22, 0x97, 0x01, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x61, 0x6e, 0x45, - 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x09, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, - 0x00, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x0c, - 0x0a, 0x0a, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x22, 0xc1, 0x02, 0x0a, - 0x16, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x70, - 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, - 0x70, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x74, 0x6f, 0x70, 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, - 0x3d, 0x0a, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, - 0x0a, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, - 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x22, 0x85, 0x01, 0x0a, 0x14, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x74, 0x6f, 0x70, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x0d, 0x54, 0x65, 0x73, + 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, + 0x01, 0x01, 0x12, 0x46, 0x0a, 0x0b, 0x70, 0x61, 0x6e, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x48, 0x02, 0x52, 0x0a, 0x70, 0x61, 0x6e, + 0x69, 0x63, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x0f, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, + 0x49, 0x44, 0x48, 0x03, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x63, + 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x04, + 0x52, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x40, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x61, + 0x6e, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x12, 0x53, 0x0a, 0x0e, + 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x50, 0x75, 0x62, 0x73, + 0x75, 0x62, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, + 0x48, 0x00, 0x52, 0x0d, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x37, 0x0a, 0x04, 0x74, 0x65, 0x73, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x45, + 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x74, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x69, 0x63, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x32, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, + 0x64, 0x48, 0x00, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x42, 0x06, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x0e, + 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x6e, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x42, 0x12, + 0x0a, 0x10, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x70, + 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x9b, 0x04, 0x0a, 0x10, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, - 0x74, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x74, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x73, - 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x74, 0x65, - 0x73, 0x74, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x7f, 0x0a, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x53, 0x70, - 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x73, 0x74, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x73, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x22, 0x9b, 0x0b, 0x0a, 0x09, 0x53, 0x70, 0x61, 0x6e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x6f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x67, 0x6f, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x64, 0x65, 0x66, - 0x5f, 0x6c, 0x6f, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x06, 0x64, 0x65, - 0x66, 0x4c, 0x6f, 0x63, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x63, 0x6f, 0x72, 0x72, 0x65, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x12, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x43, - 0x0a, 0x0b, 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x6c, 0x6f, 0x67, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x43, 0x0a, 0x0b, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, - 0x42, 0x6f, 0x64, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x0a, 0x62, 0x6f, - 0x64, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x4a, 0x0a, 0x0e, 0x72, 0x70, 0x63, 0x5f, - 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, - 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x70, 0x63, 0x43, 0x61, 0x6c, 0x6c, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x12, 0x44, 0x0a, 0x0c, 0x72, 0x70, 0x63, 0x5f, 0x63, 0x61, 0x6c, 0x6c, - 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, - 0x32, 0x2e, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0a, - 0x72, 0x70, 0x63, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x12, 0x5c, 0x0a, 0x14, 0x64, 0x62, - 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, - 0x44, 0x42, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x48, 0x00, 0x52, 0x12, 0x64, 0x62, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x56, 0x0a, 0x12, 0x64, 0x62, 0x5f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x44, 0x42, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x10, - 0x64, 0x62, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, - 0x12, 0x4a, 0x0a, 0x0e, 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, - 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0c, - 0x64, 0x62, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x44, 0x0a, 0x0c, - 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x11, 0x20, 0x01, + 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, + 0x74, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x63, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, + 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x65, + 0x78, 0x74, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x65, 0x78, 0x74, 0x43, 0x6f, + 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x15, + 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x03, 0x75, + 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6d, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x1a, 0x41, 0x0a, + 0x13, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x5f, + 0x75, 0x69, 0x64, 0x22, 0xf1, 0x02, 0x0a, 0x0e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, + 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, + 0x0a, 0x10, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x68, 0x74, 0x74, 0x70, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x64, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2e, + 0x0a, 0x10, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x88, 0x01, 0x01, 0x1a, 0x42, + 0x0a, 0x14, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, + 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x90, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x74, 0x68, + 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x61, 0x75, + 0x74, 0x68, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x97, 0x01, 0x0a, 0x0b, 0x41, + 0x75, 0x74, 0x68, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x44, + 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x22, 0xc1, 0x02, 0x0a, 0x16, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, + 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x3d, 0x0a, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x48, + 0x00, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x85, 0x01, 0x0a, 0x14, 0x50, 0x75, 0x62, + 0x73, 0x75, 0x62, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, + 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x9b, 0x01, 0x0a, 0x0d, 0x54, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x74, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x7f, + 0x0a, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x12, 0x21, 0x0a, + 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x22, + 0xee, 0x02, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x70, 0x61, 0x6e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x70, 0x61, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x3f, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2b, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x70, + 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, + 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x4c, 0x6f, + 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, + 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x54, 0x0a, 0x04, 0x4b, 0x69, + 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, + 0x0c, 0x0a, 0x08, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x0b, 0x0a, + 0x07, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x41, + 0x4c, 0x4c, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x45, 0x52, + 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x4e, 0x53, 0x55, 0x4d, 0x45, 0x52, 0x10, 0x05, + 0x22, 0xb8, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x70, 0x61, 0x6e, + 0x45, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x74, + 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x4c, + 0x6f, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x62, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, - 0x6e, 0x64, 0x12, 0x4d, 0x0a, 0x0f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, - 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x48, 0x00, 0x52, 0x0d, 0x68, 0x74, 0x74, 0x70, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x47, 0x0a, 0x0d, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x65, - 0x6e, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, + 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, + 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0xe6, 0x0b, 0x0a, 0x09, + 0x53, 0x70, 0x61, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x6f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x67, 0x6f, 0x69, 0x64, 0x12, 0x1c, 0x0a, + 0x07, 0x64, 0x65, 0x66, 0x5f, 0x6c, 0x6f, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, + 0x52, 0x06, 0x64, 0x65, 0x66, 0x4c, 0x6f, 0x63, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x63, + 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x12, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x43, 0x0a, 0x0b, 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x4c, + 0x6f, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x6c, 0x6f, 0x67, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x43, 0x0a, 0x0b, 0x62, 0x6f, 0x64, 0x79, 0x5f, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, + 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x32, 0x2e, 0x42, 0x6f, 0x64, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x00, + 0x52, 0x0a, 0x62, 0x6f, 0x64, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x4a, 0x0a, 0x0e, + 0x72, 0x70, 0x63, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x52, 0x50, 0x43, 0x43, + 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x70, 0x63, 0x43, + 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x44, 0x0a, 0x0c, 0x72, 0x70, 0x63, 0x5f, + 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, + 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, + 0x48, 0x00, 0x52, 0x0a, 0x72, 0x70, 0x63, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x12, 0x5c, + 0x0a, 0x14, 0x64, 0x62, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, + 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x32, 0x2e, 0x44, 0x42, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x12, 0x64, 0x62, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x56, 0x0a, 0x12, + 0x64, 0x62, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, + 0x6e, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, - 0x48, 0x54, 0x54, 0x50, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x68, - 0x74, 0x74, 0x70, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x12, 0x5c, 0x0a, 0x14, 0x70, 0x75, - 0x62, 0x73, 0x75, 0x62, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, + 0x44, 0x42, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, + 0x48, 0x00, 0x52, 0x10, 0x64, 0x62, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x6e, 0x64, 0x12, 0x4a, 0x0a, 0x0e, 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, + 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x32, 0x2e, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x48, 0x00, 0x52, 0x0c, 0x64, 0x62, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x12, 0x44, 0x0a, 0x0c, 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x6e, 0x64, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x44, 0x42, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x62, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x45, 0x6e, 0x64, 0x12, 0x4d, 0x0a, 0x0f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, + 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x61, 0x6c, 0x6c, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x68, 0x74, 0x74, 0x70, 0x43, 0x61, 0x6c, 0x6c, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0d, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x61, + 0x6c, 0x6c, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, + 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x48, + 0x00, 0x52, 0x0b, 0x68, 0x74, 0x74, 0x70, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x12, 0x5c, + 0x0a, 0x14, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, + 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x32, 0x2e, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x12, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x56, 0x0a, 0x12, + 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x65, + 0x6e, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, - 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x48, 0x00, 0x52, 0x12, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x73, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x56, 0x0a, 0x12, 0x70, 0x75, 0x62, 0x73, - 0x75, 0x62, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x50, 0x75, 0x62, 0x73, - 0x75, 0x62, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x10, - 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, 0x64, - 0x12, 0x50, 0x0a, 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x63, + 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, 0x64, + 0x48, 0x00, 0x52, 0x10, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x45, 0x6e, 0x64, 0x12, 0x50, 0x0a, 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x61, + 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, + 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x6c, + 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x4a, 0x0a, 0x0e, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, + 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, + 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x45, + 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x45, + 0x6e, 0x64, 0x12, 0x56, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, + 0x69, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, + 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x69, + 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x50, 0x0a, 0x10, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x19, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x45, 0x6e, 0x64, 0x12, 0x49, 0x0a, 0x0d, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x42, + 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x5f, 0x6c, 0x6f, 0x63, 0x42, 0x17, 0x0a, 0x15, 0x5f, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x22, 0xa8, 0x01, 0x0a, 0x0c, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, + 0x48, 0x0a, 0x0a, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x12, 0x32, 0x0a, + 0x03, 0x65, 0x72, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, - 0x32, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x48, 0x00, 0x52, 0x0e, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x4a, 0x0a, 0x0e, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, - 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x63, + 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x03, 0x65, 0x72, 0x72, 0x88, 0x01, + 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x10, 0x0a, 0x0e, 0x47, 0x6f, 0x72, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x22, 0x0e, 0x0a, 0x0c, 0x47, + 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x22, 0x4c, 0x0a, 0x12, 0x44, + 0x42, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, + 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, + 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x89, 0x02, 0x0a, 0x10, 0x44, 0x42, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x12, 0x55, + 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x44, 0x42, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x32, 0x0a, + 0x03, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, - 0x32, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x48, 0x00, - 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x12, 0x56, - 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x63, + 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x03, 0x65, 0x72, 0x72, 0x88, 0x01, + 0x01, 0x22, 0x2a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x4f, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, + 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x01, 0x42, 0x06, 0x0a, + 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x5c, 0x0a, 0x0c, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, - 0x32, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x69, - 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x50, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, - 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x6e, 0x69, 0x74, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x69, 0x74, 0x45, 0x6e, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x5f, 0x6c, 0x6f, 0x63, 0x42, 0x17, 0x0a, 0x15, - 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0xa8, 0x01, 0x0a, 0x0c, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, - 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x22, 0x48, 0x0a, 0x0a, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x12, 0x32, - 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x6e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, - 0x65, 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x03, 0x65, 0x72, 0x72, 0x88, - 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x10, 0x0a, 0x0e, 0x47, 0x6f, - 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x22, 0x0e, 0x0a, 0x0c, - 0x47, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x45, 0x6e, 0x64, 0x22, 0x4c, 0x0a, 0x12, - 0x44, 0x42, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, - 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, - 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x89, 0x02, 0x0a, 0x10, 0x44, - 0x42, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x12, - 0x55, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x44, 0x42, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, + 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x22, 0x48, 0x0a, 0x0a, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x6e, + 0x64, 0x12, 0x32, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, + 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x03, 0x65, + 0x72, 0x72, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x7c, 0x0a, + 0x12, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, + 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x81, 0x01, 0x0a, 0x10, + 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, 0x64, + 0x12, 0x22, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, + 0x64, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x01, + 0x52, 0x03, 0x65, 0x72, 0x72, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, + 0x2c, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x4c, 0x0a, + 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x45, 0x6e, 0x64, 0x12, + 0x32, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, + 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x03, 0x65, 0x72, 0x72, + 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x90, 0x01, 0x0a, 0x0e, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x32, - 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x6e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, - 0x65, 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x03, 0x65, 0x72, 0x72, 0x88, - 0x01, 0x01, 0x22, 0x2a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x4f, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, - 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x01, 0x42, 0x06, - 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x5c, 0x0a, 0x0c, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x36, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, - 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x22, 0x48, 0x0a, 0x0a, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, - 0x6e, 0x64, 0x12, 0x32, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0xd4, + 0x01, 0x0a, 0x0c, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x12, + 0x41, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x29, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x6c, 0x6c, + 0x45, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x32, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x03, - 0x65, 0x72, 0x72, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x7c, - 0x0a, 0x12, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x81, 0x01, 0x0a, - 0x10, 0x50, 0x75, 0x62, 0x73, 0x75, 0x62, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, - 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, - 0x01, 0x52, 0x03, 0x65, 0x72, 0x72, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, - 0x22, 0x2c, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x4c, - 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x45, 0x6e, 0x64, - 0x12, 0x32, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, - 0x61, 0x63, 0x65, 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x03, 0x65, 0x72, - 0x72, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x90, 0x01, 0x0a, - 0x0e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, - 0xd4, 0x01, 0x0a, 0x0c, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, - 0x12, 0x41, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x29, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, - 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x6c, - 0x6c, 0x45, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x12, 0x32, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, - 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, - 0x03, 0x65, 0x72, 0x72, 0x88, 0x01, 0x01, 0x22, 0x45, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x06, - 0x0a, 0x02, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x4f, 0x5f, 0x53, 0x55, 0x43, - 0x48, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x4e, 0x46, 0x4c, - 0x49, 0x43, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x52, 0x52, 0x10, 0x04, 0x42, 0x06, - 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x61, 0x0a, 0x0a, 0x42, 0x6f, 0x64, 0x79, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, - 0x77, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6f, 0x76, 0x65, 0x72, 0x66, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xd5, 0x01, 0x0a, 0x0d, 0x48, 0x54, - 0x54, 0x50, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x63, - 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x17, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, - 0x72, 0x6c, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, - 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, - 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x74, 0x69, 0x6d, - 0x65, 0x22, 0xc8, 0x01, 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, - 0x64, 0x12, 0x24, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x43, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x02, + 0x65, 0x72, 0x72, 0x88, 0x01, 0x01, 0x22, 0x45, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x06, 0x0a, + 0x02, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x4f, 0x5f, 0x53, 0x55, 0x43, 0x48, + 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x4e, 0x46, 0x4c, 0x49, + 0x43, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x52, 0x52, 0x10, 0x04, 0x42, 0x06, 0x0a, + 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x88, 0x02, 0x0a, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, + 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x48, 0x01, 0x52, 0x03, 0x65, 0x72, 0x72, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x0c, 0x74, - 0x72, 0x61, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, - 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x54, 0x72, 0x61, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, - 0x63, 0x6f, 0x64, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x90, 0x09, 0x0a, - 0x0e, 0x48, 0x54, 0x54, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6e, 0x61, 0x6e, 0x6f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x08, 0x6e, 0x61, 0x6e, 0x6f, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x67, - 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, - 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, - 0x48, 0x00, 0x52, 0x07, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x12, 0x3e, 0x0a, 0x08, 0x67, - 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, - 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x47, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x6e, - 0x48, 0x00, 0x52, 0x07, 0x67, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x12, 0x67, 0x0a, 0x17, 0x67, - 0x6f, 0x74, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, + 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x3e, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, - 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x47, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x79, 0x74, 0x65, 0x48, 0x00, 0x52, 0x14, - 0x67, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x42, 0x79, 0x74, 0x65, 0x12, 0x54, 0x0a, 0x10, 0x67, 0x6f, 0x74, 0x5f, 0x31, 0x78, 0x78, 0x5f, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x63, 0x65, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x0a, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x22, 0x61, 0x0a, 0x0a, 0x42, 0x6f, 0x64, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1f, + 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x22, 0xd5, 0x01, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x43, 0x61, 0x6c, 0x6c, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x63, 0x6f, 0x72, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x61, 0x6e, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x36, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x61, + 0x6e, 0x6f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xc8, 0x01, 0x0a, 0x0b, + 0x48, 0x54, 0x54, 0x50, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x12, 0x24, 0x0a, 0x0b, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x32, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, - 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x47, 0x6f, 0x74, 0x31, 0x78, 0x78, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x67, 0x6f, 0x74, 0x31, - 0x78, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x6e, - 0x73, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x03, 0x65, + 0x72, 0x72, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x0e, + 0x0a, 0x0c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x42, 0x06, + 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x90, 0x09, 0x0a, 0x0e, 0x48, 0x54, 0x54, 0x50, 0x54, + 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x61, 0x6e, + 0x6f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x61, 0x6e, + 0x6f, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, + 0x54, 0x54, 0x50, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x48, 0x00, 0x52, 0x07, 0x67, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x12, 0x3e, 0x0a, 0x08, 0x67, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, + 0x54, 0x54, 0x50, 0x47, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x48, 0x00, 0x52, 0x07, 0x67, 0x6f, + 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x12, 0x67, 0x0a, 0x17, 0x67, 0x6f, 0x74, 0x5f, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, + 0x54, 0x50, 0x47, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x42, 0x79, 0x74, 0x65, 0x48, 0x00, 0x52, 0x14, 0x67, 0x6f, 0x74, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x79, 0x74, 0x65, 0x12, 0x54, + 0x0a, 0x10, 0x67, 0x6f, 0x74, 0x5f, 0x31, 0x78, 0x78, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, + 0x48, 0x54, 0x54, 0x50, 0x47, 0x6f, 0x74, 0x31, 0x78, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x67, 0x6f, 0x74, 0x31, 0x78, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x6e, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, + 0x54, 0x54, 0x50, 0x44, 0x4e, 0x53, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x08, 0x64, + 0x6e, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x64, 0x6e, 0x73, 0x5f, 0x64, + 0x6f, 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, + 0x2e, 0x48, 0x54, 0x54, 0x50, 0x44, 0x4e, 0x53, 0x44, 0x6f, 0x6e, 0x65, 0x48, 0x00, 0x52, 0x07, + 0x64, 0x6e, 0x73, 0x44, 0x6f, 0x6e, 0x65, 0x12, 0x4d, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, + 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x4a, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x5f, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, + 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x44, + 0x6f, 0x6e, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x44, 0x6f, + 0x6e, 0x65, 0x12, 0x5d, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, + 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x54, 0x4c, 0x53, 0x48, 0x61, + 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x11, + 0x74, 0x6c, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x5a, 0x0a, 0x12, 0x74, 0x6c, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, + 0x6b, 0x65, 0x5f, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, - 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x44, 0x4e, 0x53, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x48, 0x00, 0x52, 0x08, 0x64, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x3e, 0x0a, - 0x08, 0x64, 0x6e, 0x73, 0x5f, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, - 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x44, 0x4e, 0x53, 0x44, 0x6f, - 0x6e, 0x65, 0x48, 0x00, 0x52, 0x07, 0x64, 0x6e, 0x73, 0x44, 0x6f, 0x6e, 0x65, 0x12, 0x4d, 0x0a, - 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x08, + 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x54, 0x4c, 0x53, 0x48, 0x61, 0x6e, 0x64, + 0x73, 0x68, 0x61, 0x6b, 0x65, 0x44, 0x6f, 0x6e, 0x65, 0x48, 0x00, 0x52, 0x10, 0x74, 0x6c, 0x73, + 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x44, 0x6f, 0x6e, 0x65, 0x12, 0x4d, 0x0a, + 0x0d, 0x77, 0x72, 0x6f, 0x74, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0c, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x4a, 0x0a, 0x0c, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x44, 0x6f, 0x6e, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x44, 0x6f, 0x6e, 0x65, 0x12, 0x5d, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, - 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, - 0x50, 0x54, 0x4c, 0x53, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x48, 0x00, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, - 0x6b, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x5a, 0x0a, 0x12, 0x74, 0x6c, 0x73, 0x5f, 0x68, - 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x5f, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x54, - 0x4c, 0x53, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x44, 0x6f, 0x6e, 0x65, 0x48, - 0x00, 0x52, 0x10, 0x74, 0x6c, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x44, - 0x6f, 0x6e, 0x65, 0x12, 0x4d, 0x0a, 0x0d, 0x77, 0x72, 0x6f, 0x74, 0x65, 0x5f, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, - 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x57, 0x72, 0x6f, 0x74, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x77, 0x72, 0x6f, 0x74, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x4d, 0x0a, 0x0d, 0x77, 0x72, 0x6f, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x63, 0x6f, + 0x57, 0x72, 0x6f, 0x74, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x0c, + 0x77, 0x72, 0x6f, 0x74, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4d, 0x0a, 0x0d, + 0x77, 0x72, 0x6f, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x57, + 0x72, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x77, + 0x72, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x57, 0x0a, 0x11, 0x77, + 0x61, 0x69, 0x74, 0x5f, 0x31, 0x30, 0x30, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, + 0x54, 0x50, 0x57, 0x61, 0x69, 0x74, 0x31, 0x30, 0x30, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x48, 0x00, 0x52, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x31, 0x30, 0x30, 0x43, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x65, 0x12, 0x4b, 0x0a, 0x0b, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x62, + 0x6f, 0x64, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, - 0x2e, 0x48, 0x54, 0x54, 0x50, 0x57, 0x72, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x48, 0x00, 0x52, 0x0c, 0x77, 0x72, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x57, 0x0a, 0x11, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x31, 0x30, 0x30, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, - 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, - 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x57, 0x61, 0x69, 0x74, 0x31, 0x30, 0x30, 0x43, - 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x31, - 0x30, 0x30, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x12, 0x4b, 0x0a, 0x0b, 0x63, 0x6c, - 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, - 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x6c, 0x6f, 0x73, 0x65, - 0x64, 0x42, 0x6f, 0x64, 0x79, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x6c, 0x6f, - 0x73, 0x65, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, - 0x2a, 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x12, 0x1b, - 0x0a, 0x09, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x22, 0x6a, 0x0a, 0x0b, 0x48, - 0x54, 0x54, 0x50, 0x47, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, - 0x75, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x75, 0x73, - 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x77, 0x61, 0x73, 0x5f, 0x69, 0x64, 0x6c, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x77, 0x61, 0x73, 0x49, 0x64, 0x6c, 0x65, 0x12, 0x28, 0x0a, - 0x10, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x69, 0x64, 0x6c, 0x65, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x48, 0x54, 0x54, 0x50, 0x47, - 0x6f, 0x74, 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, - 0x79, 0x74, 0x65, 0x22, 0x28, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x47, 0x6f, 0x74, 0x31, 0x78, - 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x22, 0x0a, - 0x0c, 0x48, 0x54, 0x54, 0x50, 0x44, 0x4e, 0x53, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, - 0x74, 0x22, 0x61, 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x44, 0x4e, 0x53, 0x44, 0x6f, 0x6e, 0x65, + 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x44, + 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x42, 0x6f, 0x64, + 0x79, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2a, 0x0a, 0x0b, 0x48, 0x54, 0x54, + 0x50, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x6f, 0x73, 0x74, + 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x50, 0x6f, 0x72, 0x74, 0x22, 0x6a, 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x47, 0x6f, 0x74, + 0x43, 0x6f, 0x6e, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x75, 0x73, 0x65, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x75, 0x73, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, + 0x77, 0x61, 0x73, 0x5f, 0x69, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x77, 0x61, 0x73, 0x49, 0x64, 0x6c, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x64, 0x6c, 0x65, 0x5f, + 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0e, 0x69, 0x64, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x48, 0x54, 0x54, 0x50, 0x47, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x79, 0x74, 0x65, 0x22, 0x28, 0x0a, + 0x12, 0x48, 0x54, 0x54, 0x50, 0x47, 0x6f, 0x74, 0x31, 0x78, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x22, 0x0a, 0x0c, 0x48, 0x54, 0x54, 0x50, 0x44, + 0x4e, 0x53, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x22, 0x61, 0x0a, 0x0b, 0x48, + 0x54, 0x54, 0x50, 0x44, 0x4e, 0x53, 0x44, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x03, 0x65, 0x72, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x65, 0x72, 0x72, 0x88, 0x01, + 0x01, 0x12, 0x33, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, + 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x44, 0x4e, 0x53, 0x41, 0x64, 0x64, 0x72, 0x52, + 0x05, 0x61, 0x64, 0x64, 0x72, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x19, + 0x0a, 0x07, 0x44, 0x4e, 0x53, 0x41, 0x64, 0x64, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x70, 0x22, 0x40, 0x0a, 0x10, 0x48, 0x54, 0x54, + 0x50, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x22, 0x51, 0x0a, 0x0f, 0x48, + 0x54, 0x54, 0x50, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x44, 0x6f, 0x6e, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x10, 0x0a, 0x03, + 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x65, 0x72, 0x72, 0x22, 0x17, + 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x54, 0x4c, 0x53, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, + 0x6b, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x22, 0xcb, 0x01, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, + 0x54, 0x4c, 0x53, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x44, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, - 0x03, 0x65, 0x72, 0x72, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x72, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x44, 0x4e, - 0x53, 0x41, 0x64, 0x64, 0x72, 0x52, 0x05, 0x61, 0x64, 0x64, 0x72, 0x73, 0x42, 0x06, 0x0a, 0x04, - 0x5f, 0x65, 0x72, 0x72, 0x22, 0x19, 0x0a, 0x07, 0x44, 0x4e, 0x53, 0x41, 0x64, 0x64, 0x72, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x70, 0x22, - 0x40, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, - 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, - 0x72, 0x22, 0x51, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x44, 0x6f, 0x6e, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, - 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, - 0x64, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x65, 0x72, 0x72, 0x22, 0x17, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x54, 0x4c, 0x53, 0x48, - 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x22, 0xcb, 0x01, - 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x54, 0x4c, 0x53, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, - 0x6b, 0x65, 0x44, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x65, 0x72, 0x72, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, - 0x0b, 0x74, 0x6c, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6c, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, - 0x0a, 0x0c, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x6e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x6e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x12, 0x0a, 0x10, 0x48, - 0x54, 0x54, 0x50, 0x57, 0x72, 0x6f, 0x74, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x22, - 0x31, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x57, 0x72, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x48, 0x00, 0x52, 0x03, 0x65, 0x72, 0x72, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, - 0x72, 0x72, 0x22, 0x15, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x57, 0x61, 0x69, 0x74, 0x31, 0x30, - 0x30, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x22, 0x33, 0x0a, 0x12, 0x48, 0x54, 0x54, - 0x50, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, - 0x15, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, - 0x65, 0x72, 0x72, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x8a, - 0x02, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, - 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x65, - 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, - 0x63, 0x65, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x6d, - 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x36, 0x0a, - 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, - 0x61, 0x63, 0x65, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x3c, 0x0a, - 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, - 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, - 0x12, 0x09, 0x0a, 0x05, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x04, 0x22, 0xd8, 0x02, 0x0a, 0x08, - 0x4c, 0x6f, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x6e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, - 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x12, 0x0a, 0x03, 0x73, 0x74, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, - 0x73, 0x74, 0x72, 0x12, 0x14, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x48, 0x00, 0x52, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x03, 0x64, - 0x75, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x03, 0x64, 0x75, 0x72, 0x12, - 0x14, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, - 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x03, 0x69, - 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x03, 0x69, 0x6e, 0x74, 0x12, - 0x14, 0x0a, 0x04, 0x75, 0x69, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, - 0x04, 0x75, 0x69, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x07, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x32, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x48, 0x00, 0x52, 0x07, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, - 0x32, 0x12, 0x1a, 0x0a, 0x07, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x36, 0x34, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x01, 0x48, 0x00, 0x52, 0x07, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x36, 0x34, 0x42, 0x07, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x58, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, - 0x72, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x03, 0x52, 0x03, 0x70, 0x63, 0x73, 0x12, 0x38, 0x0a, 0x06, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x03, 0x65, 0x72, 0x72, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6c, 0x73, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6c, + 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x69, 0x70, 0x68, + 0x65, 0x72, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, + 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x13, + 0x6e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x67, 0x6f, 0x74, + 0x69, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x06, 0x0a, + 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x12, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x57, 0x72, 0x6f, + 0x74, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x22, 0x31, 0x0a, 0x10, 0x48, 0x54, 0x54, + 0x50, 0x57, 0x72, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, + 0x03, 0x65, 0x72, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x65, 0x72, + 0x72, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x15, 0x0a, 0x13, + 0x48, 0x54, 0x54, 0x50, 0x57, 0x61, 0x69, 0x74, 0x31, 0x30, 0x30, 0x43, 0x6f, 0x6e, 0x74, 0x69, + 0x6e, 0x75, 0x65, 0x22, 0x33, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x43, 0x6c, 0x6f, 0x73, 0x65, + 0x64, 0x42, 0x6f, 0x64, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x15, 0x0a, 0x03, 0x65, 0x72, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x03, 0x65, 0x72, 0x72, 0x88, 0x01, 0x01, + 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x72, 0x72, 0x22, 0x8a, 0x02, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x4c, 0x6f, + 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x36, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x4c, + 0x6f, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, + 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, + 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x3c, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x12, 0x09, 0x0a, 0x05, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, + 0x4e, 0x46, 0x4f, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, + 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x52, + 0x41, 0x43, 0x45, 0x10, 0x04, 0x22, 0xd8, 0x02, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x03, 0x73, 0x74, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x73, 0x74, 0x72, 0x12, 0x14, 0x0a, + 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x04, 0x62, + 0x6f, 0x6f, 0x6c, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, + 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x03, 0x64, 0x75, 0x72, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x00, 0x52, 0x03, 0x64, 0x75, 0x72, 0x12, 0x14, 0x0a, 0x04, 0x75, 0x75, 0x69, + 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, + 0x14, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, + 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x03, 0x69, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x00, 0x52, 0x03, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x04, 0x75, 0x69, 0x6e, + 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x04, 0x75, 0x69, 0x6e, 0x74, 0x12, + 0x1a, 0x0a, 0x07, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x32, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, + 0x48, 0x00, 0x52, 0x07, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x32, 0x12, 0x1a, 0x0a, 0x07, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x36, 0x34, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x07, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x36, 0x34, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x58, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x03, 0x70, 0x63, 0x73, + 0x12, 0x38, 0x0a, 0x06, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, + 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x52, 0x06, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x0a, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x60, 0x0a, 0x05, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x06, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, - 0x22, 0x50, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x75, - 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x12, 0x12, - 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, - 0x6e, 0x65, 0x22, 0x60, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6d, - 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x3b, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, - 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x61, - 0x63, 0x65, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x48, 0x00, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x2a, 0xb1, 0x02, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x54, 0x72, 0x61, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, - 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x45, 0x54, 0x5f, - 0x43, 0x4f, 0x4e, 0x4e, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x54, 0x5f, 0x43, 0x4f, - 0x4e, 0x4e, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x47, 0x4f, 0x54, 0x5f, 0x46, 0x49, 0x52, 0x53, - 0x54, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x10, - 0x03, 0x12, 0x14, 0x0a, 0x10, 0x47, 0x4f, 0x54, 0x5f, 0x31, 0x58, 0x58, 0x5f, 0x52, 0x45, 0x53, - 0x50, 0x4f, 0x4e, 0x53, 0x45, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x4e, 0x53, 0x5f, 0x53, - 0x54, 0x41, 0x52, 0x54, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x4e, 0x53, 0x5f, 0x44, 0x4f, - 0x4e, 0x45, 0x10, 0x06, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x5f, - 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x4f, 0x4e, 0x4e, 0x45, - 0x43, 0x54, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x08, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x4c, 0x53, - 0x5f, 0x48, 0x41, 0x4e, 0x44, 0x53, 0x48, 0x41, 0x4b, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, - 0x10, 0x09, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x4c, 0x53, 0x5f, 0x48, 0x41, 0x4e, 0x44, 0x53, 0x48, - 0x41, 0x4b, 0x45, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x0a, 0x12, 0x11, 0x0a, 0x0d, 0x57, 0x52, - 0x4f, 0x54, 0x45, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x53, 0x10, 0x0b, 0x12, 0x11, 0x0a, - 0x0d, 0x57, 0x52, 0x4f, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x0c, - 0x12, 0x15, 0x0a, 0x11, 0x57, 0x41, 0x49, 0x54, 0x5f, 0x31, 0x30, 0x30, 0x5f, 0x43, 0x4f, 0x4e, - 0x54, 0x49, 0x4e, 0x55, 0x45, 0x10, 0x0d, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4c, 0x4f, 0x53, 0x45, - 0x44, 0x5f, 0x42, 0x4f, 0x44, 0x59, 0x10, 0x0e, 0x42, 0x25, 0x5a, 0x23, 0x65, 0x6e, 0x63, 0x72, - 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x63, 0x6f, 0x72, - 0x65, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x48, 0x00, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2a, 0xb1, + 0x02, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x45, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x10, 0x01, + 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x10, 0x02, 0x12, 0x1b, + 0x0a, 0x17, 0x47, 0x4f, 0x54, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x52, 0x45, 0x53, 0x50, + 0x4f, 0x4e, 0x53, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x47, + 0x4f, 0x54, 0x5f, 0x31, 0x58, 0x58, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x45, 0x10, + 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x4e, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x05, + 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x4e, 0x53, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x06, 0x12, 0x11, + 0x0a, 0x0d, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, + 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x5f, 0x44, 0x4f, 0x4e, + 0x45, 0x10, 0x08, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x4c, 0x53, 0x5f, 0x48, 0x41, 0x4e, 0x44, 0x53, + 0x48, 0x41, 0x4b, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x09, 0x12, 0x16, 0x0a, 0x12, + 0x54, 0x4c, 0x53, 0x5f, 0x48, 0x41, 0x4e, 0x44, 0x53, 0x48, 0x41, 0x4b, 0x45, 0x5f, 0x44, 0x4f, + 0x4e, 0x45, 0x10, 0x0a, 0x12, 0x11, 0x0a, 0x0d, 0x57, 0x52, 0x4f, 0x54, 0x45, 0x5f, 0x48, 0x45, + 0x41, 0x44, 0x45, 0x52, 0x53, 0x10, 0x0b, 0x12, 0x11, 0x0a, 0x0d, 0x57, 0x52, 0x4f, 0x54, 0x45, + 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x0c, 0x12, 0x15, 0x0a, 0x11, 0x57, 0x41, + 0x49, 0x54, 0x5f, 0x31, 0x30, 0x30, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x45, 0x10, + 0x0d, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x5f, 0x42, 0x4f, 0x44, 0x59, + 0x10, 0x0e, 0x42, 0x25, 0x5a, 0x23, 0x65, 0x6e, 0x63, 0x72, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x65, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -5122,155 +5512,173 @@ func file_encore_engine_trace2_trace2_proto_rawDescGZIP() []byte { return file_encore_engine_trace2_trace2_proto_rawDescData } -var file_encore_engine_trace2_trace2_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_encore_engine_trace2_trace2_proto_msgTypes = make([]protoimpl.MessageInfo, 55) +var file_encore_engine_trace2_trace2_proto_enumTypes = make([]protoimpl.EnumInfo, 6) +var file_encore_engine_trace2_trace2_proto_msgTypes = make([]protoimpl.MessageInfo, 58) var file_encore_engine_trace2_trace2_proto_goTypes = []interface{}{ (HTTPTraceEventCode)(0), // 0: encore.engine.trace2.HTTPTraceEventCode (SpanSummary_SpanType)(0), // 1: encore.engine.trace2.SpanSummary.SpanType - (DBTransactionEnd_CompletionType)(0), // 2: encore.engine.trace2.DBTransactionEnd.CompletionType - (CacheCallEnd_Result)(0), // 3: encore.engine.trace2.CacheCallEnd.Result - (LogMessage_Level)(0), // 4: encore.engine.trace2.LogMessage.Level - (*SpanSummary)(nil), // 5: encore.engine.trace2.SpanSummary - (*TraceID)(nil), // 6: encore.engine.trace2.TraceID - (*EventList)(nil), // 7: encore.engine.trace2.EventList - (*TraceEvent)(nil), // 8: encore.engine.trace2.TraceEvent - (*SpanStart)(nil), // 9: encore.engine.trace2.SpanStart - (*SpanEnd)(nil), // 10: encore.engine.trace2.SpanEnd - (*RequestSpanStart)(nil), // 11: encore.engine.trace2.RequestSpanStart - (*RequestSpanEnd)(nil), // 12: encore.engine.trace2.RequestSpanEnd - (*AuthSpanStart)(nil), // 13: encore.engine.trace2.AuthSpanStart - (*AuthSpanEnd)(nil), // 14: encore.engine.trace2.AuthSpanEnd - (*PubsubMessageSpanStart)(nil), // 15: encore.engine.trace2.PubsubMessageSpanStart - (*PubsubMessageSpanEnd)(nil), // 16: encore.engine.trace2.PubsubMessageSpanEnd - (*TestSpanStart)(nil), // 17: encore.engine.trace2.TestSpanStart - (*TestSpanEnd)(nil), // 18: encore.engine.trace2.TestSpanEnd - (*SpanEvent)(nil), // 19: encore.engine.trace2.SpanEvent - (*RPCCallStart)(nil), // 20: encore.engine.trace2.RPCCallStart - (*RPCCallEnd)(nil), // 21: encore.engine.trace2.RPCCallEnd - (*GoroutineStart)(nil), // 22: encore.engine.trace2.GoroutineStart - (*GoroutineEnd)(nil), // 23: encore.engine.trace2.GoroutineEnd - (*DBTransactionStart)(nil), // 24: encore.engine.trace2.DBTransactionStart - (*DBTransactionEnd)(nil), // 25: encore.engine.trace2.DBTransactionEnd - (*DBQueryStart)(nil), // 26: encore.engine.trace2.DBQueryStart - (*DBQueryEnd)(nil), // 27: encore.engine.trace2.DBQueryEnd - (*PubsubPublishStart)(nil), // 28: encore.engine.trace2.PubsubPublishStart - (*PubsubPublishEnd)(nil), // 29: encore.engine.trace2.PubsubPublishEnd - (*ServiceInitStart)(nil), // 30: encore.engine.trace2.ServiceInitStart - (*ServiceInitEnd)(nil), // 31: encore.engine.trace2.ServiceInitEnd - (*CacheCallStart)(nil), // 32: encore.engine.trace2.CacheCallStart - (*CacheCallEnd)(nil), // 33: encore.engine.trace2.CacheCallEnd - (*BodyStream)(nil), // 34: encore.engine.trace2.BodyStream - (*HTTPCallStart)(nil), // 35: encore.engine.trace2.HTTPCallStart - (*HTTPCallEnd)(nil), // 36: encore.engine.trace2.HTTPCallEnd - (*HTTPTraceEvent)(nil), // 37: encore.engine.trace2.HTTPTraceEvent - (*HTTPGetConn)(nil), // 38: encore.engine.trace2.HTTPGetConn - (*HTTPGotConn)(nil), // 39: encore.engine.trace2.HTTPGotConn - (*HTTPGotFirstResponseByte)(nil), // 40: encore.engine.trace2.HTTPGotFirstResponseByte - (*HTTPGot1XxResponse)(nil), // 41: encore.engine.trace2.HTTPGot1xxResponse - (*HTTPDNSStart)(nil), // 42: encore.engine.trace2.HTTPDNSStart - (*HTTPDNSDone)(nil), // 43: encore.engine.trace2.HTTPDNSDone - (*DNSAddr)(nil), // 44: encore.engine.trace2.DNSAddr - (*HTTPConnectStart)(nil), // 45: encore.engine.trace2.HTTPConnectStart - (*HTTPConnectDone)(nil), // 46: encore.engine.trace2.HTTPConnectDone - (*HTTPTLSHandshakeStart)(nil), // 47: encore.engine.trace2.HTTPTLSHandshakeStart - (*HTTPTLSHandshakeDone)(nil), // 48: encore.engine.trace2.HTTPTLSHandshakeDone - (*HTTPWroteHeaders)(nil), // 49: encore.engine.trace2.HTTPWroteHeaders - (*HTTPWroteRequest)(nil), // 50: encore.engine.trace2.HTTPWroteRequest - (*HTTPWait100Continue)(nil), // 51: encore.engine.trace2.HTTPWait100Continue - (*HTTPClosedBodyData)(nil), // 52: encore.engine.trace2.HTTPClosedBodyData - (*LogMessage)(nil), // 53: encore.engine.trace2.LogMessage - (*LogField)(nil), // 54: encore.engine.trace2.LogField - (*StackTrace)(nil), // 55: encore.engine.trace2.StackTrace - (*StackFrame)(nil), // 56: encore.engine.trace2.StackFrame - (*Error)(nil), // 57: encore.engine.trace2.Error - nil, // 58: encore.engine.trace2.RequestSpanStart.RequestHeadersEntry - nil, // 59: encore.engine.trace2.RequestSpanEnd.ResponseHeadersEntry - (*timestamppb.Timestamp)(nil), // 60: google.protobuf.Timestamp + (GenericSpanStart_Kind)(0), // 2: encore.engine.trace2.GenericSpanStart.Kind + (DBTransactionEnd_CompletionType)(0), // 3: encore.engine.trace2.DBTransactionEnd.CompletionType + (CacheCallEnd_Result)(0), // 4: encore.engine.trace2.CacheCallEnd.Result + (LogMessage_Level)(0), // 5: encore.engine.trace2.LogMessage.Level + (*SpanSummary)(nil), // 6: encore.engine.trace2.SpanSummary + (*TraceID)(nil), // 7: encore.engine.trace2.TraceID + (*EventList)(nil), // 8: encore.engine.trace2.EventList + (*TraceEvent)(nil), // 9: encore.engine.trace2.TraceEvent + (*SpanStart)(nil), // 10: encore.engine.trace2.SpanStart + (*SpanEnd)(nil), // 11: encore.engine.trace2.SpanEnd + (*RequestSpanStart)(nil), // 12: encore.engine.trace2.RequestSpanStart + (*RequestSpanEnd)(nil), // 13: encore.engine.trace2.RequestSpanEnd + (*AuthSpanStart)(nil), // 14: encore.engine.trace2.AuthSpanStart + (*AuthSpanEnd)(nil), // 15: encore.engine.trace2.AuthSpanEnd + (*PubsubMessageSpanStart)(nil), // 16: encore.engine.trace2.PubsubMessageSpanStart + (*PubsubMessageSpanEnd)(nil), // 17: encore.engine.trace2.PubsubMessageSpanEnd + (*TestSpanStart)(nil), // 18: encore.engine.trace2.TestSpanStart + (*TestSpanEnd)(nil), // 19: encore.engine.trace2.TestSpanEnd + (*GenericSpanStart)(nil), // 20: encore.engine.trace2.GenericSpanStart + (*GenericSpanEnd)(nil), // 21: encore.engine.trace2.GenericSpanEnd + (*SpanEvent)(nil), // 22: encore.engine.trace2.SpanEvent + (*RPCCallStart)(nil), // 23: encore.engine.trace2.RPCCallStart + (*RPCCallEnd)(nil), // 24: encore.engine.trace2.RPCCallEnd + (*GoroutineStart)(nil), // 25: encore.engine.trace2.GoroutineStart + (*GoroutineEnd)(nil), // 26: encore.engine.trace2.GoroutineEnd + (*DBTransactionStart)(nil), // 27: encore.engine.trace2.DBTransactionStart + (*DBTransactionEnd)(nil), // 28: encore.engine.trace2.DBTransactionEnd + (*DBQueryStart)(nil), // 29: encore.engine.trace2.DBQueryStart + (*DBQueryEnd)(nil), // 30: encore.engine.trace2.DBQueryEnd + (*PubsubPublishStart)(nil), // 31: encore.engine.trace2.PubsubPublishStart + (*PubsubPublishEnd)(nil), // 32: encore.engine.trace2.PubsubPublishEnd + (*ServiceInitStart)(nil), // 33: encore.engine.trace2.ServiceInitStart + (*ServiceInitEnd)(nil), // 34: encore.engine.trace2.ServiceInitEnd + (*CacheCallStart)(nil), // 35: encore.engine.trace2.CacheCallStart + (*CacheCallEnd)(nil), // 36: encore.engine.trace2.CacheCallEnd + (*GenericEvent)(nil), // 37: encore.engine.trace2.GenericEvent + (*BodyStream)(nil), // 38: encore.engine.trace2.BodyStream + (*HTTPCallStart)(nil), // 39: encore.engine.trace2.HTTPCallStart + (*HTTPCallEnd)(nil), // 40: encore.engine.trace2.HTTPCallEnd + (*HTTPTraceEvent)(nil), // 41: encore.engine.trace2.HTTPTraceEvent + (*HTTPGetConn)(nil), // 42: encore.engine.trace2.HTTPGetConn + (*HTTPGotConn)(nil), // 43: encore.engine.trace2.HTTPGotConn + (*HTTPGotFirstResponseByte)(nil), // 44: encore.engine.trace2.HTTPGotFirstResponseByte + (*HTTPGot1XxResponse)(nil), // 45: encore.engine.trace2.HTTPGot1xxResponse + (*HTTPDNSStart)(nil), // 46: encore.engine.trace2.HTTPDNSStart + (*HTTPDNSDone)(nil), // 47: encore.engine.trace2.HTTPDNSDone + (*DNSAddr)(nil), // 48: encore.engine.trace2.DNSAddr + (*HTTPConnectStart)(nil), // 49: encore.engine.trace2.HTTPConnectStart + (*HTTPConnectDone)(nil), // 50: encore.engine.trace2.HTTPConnectDone + (*HTTPTLSHandshakeStart)(nil), // 51: encore.engine.trace2.HTTPTLSHandshakeStart + (*HTTPTLSHandshakeDone)(nil), // 52: encore.engine.trace2.HTTPTLSHandshakeDone + (*HTTPWroteHeaders)(nil), // 53: encore.engine.trace2.HTTPWroteHeaders + (*HTTPWroteRequest)(nil), // 54: encore.engine.trace2.HTTPWroteRequest + (*HTTPWait100Continue)(nil), // 55: encore.engine.trace2.HTTPWait100Continue + (*HTTPClosedBodyData)(nil), // 56: encore.engine.trace2.HTTPClosedBodyData + (*LogMessage)(nil), // 57: encore.engine.trace2.LogMessage + (*LogField)(nil), // 58: encore.engine.trace2.LogField + (*StackTrace)(nil), // 59: encore.engine.trace2.StackTrace + (*StackFrame)(nil), // 60: encore.engine.trace2.StackFrame + (*Error)(nil), // 61: encore.engine.trace2.Error + nil, // 62: encore.engine.trace2.RequestSpanStart.RequestHeadersEntry + nil, // 63: encore.engine.trace2.RequestSpanEnd.ResponseHeadersEntry + (*timestamppb.Timestamp)(nil), // 64: google.protobuf.Timestamp } var file_encore_engine_trace2_trace2_proto_depIdxs = []int32{ 1, // 0: encore.engine.trace2.SpanSummary.type:type_name -> encore.engine.trace2.SpanSummary.SpanType - 60, // 1: encore.engine.trace2.SpanSummary.started_at:type_name -> google.protobuf.Timestamp - 8, // 2: encore.engine.trace2.EventList.events:type_name -> encore.engine.trace2.TraceEvent - 6, // 3: encore.engine.trace2.TraceEvent.trace_id:type_name -> encore.engine.trace2.TraceID - 60, // 4: encore.engine.trace2.TraceEvent.event_time:type_name -> google.protobuf.Timestamp - 9, // 5: encore.engine.trace2.TraceEvent.span_start:type_name -> encore.engine.trace2.SpanStart - 10, // 6: encore.engine.trace2.TraceEvent.span_end:type_name -> encore.engine.trace2.SpanEnd - 19, // 7: encore.engine.trace2.TraceEvent.span_event:type_name -> encore.engine.trace2.SpanEvent - 6, // 8: encore.engine.trace2.SpanStart.parent_trace_id:type_name -> encore.engine.trace2.TraceID - 11, // 9: encore.engine.trace2.SpanStart.request:type_name -> encore.engine.trace2.RequestSpanStart - 13, // 10: encore.engine.trace2.SpanStart.auth:type_name -> encore.engine.trace2.AuthSpanStart - 15, // 11: encore.engine.trace2.SpanStart.pubsub_message:type_name -> encore.engine.trace2.PubsubMessageSpanStart - 17, // 12: encore.engine.trace2.SpanStart.test:type_name -> encore.engine.trace2.TestSpanStart - 57, // 13: encore.engine.trace2.SpanEnd.error:type_name -> encore.engine.trace2.Error - 55, // 14: encore.engine.trace2.SpanEnd.panic_stack:type_name -> encore.engine.trace2.StackTrace - 6, // 15: encore.engine.trace2.SpanEnd.parent_trace_id:type_name -> encore.engine.trace2.TraceID - 12, // 16: encore.engine.trace2.SpanEnd.request:type_name -> encore.engine.trace2.RequestSpanEnd - 14, // 17: encore.engine.trace2.SpanEnd.auth:type_name -> encore.engine.trace2.AuthSpanEnd - 16, // 18: encore.engine.trace2.SpanEnd.pubsub_message:type_name -> encore.engine.trace2.PubsubMessageSpanEnd - 18, // 19: encore.engine.trace2.SpanEnd.test:type_name -> encore.engine.trace2.TestSpanEnd - 58, // 20: encore.engine.trace2.RequestSpanStart.request_headers:type_name -> encore.engine.trace2.RequestSpanStart.RequestHeadersEntry - 59, // 21: encore.engine.trace2.RequestSpanEnd.response_headers:type_name -> encore.engine.trace2.RequestSpanEnd.ResponseHeadersEntry - 60, // 22: encore.engine.trace2.PubsubMessageSpanStart.publish_time:type_name -> google.protobuf.Timestamp - 53, // 23: encore.engine.trace2.SpanEvent.log_message:type_name -> encore.engine.trace2.LogMessage - 34, // 24: encore.engine.trace2.SpanEvent.body_stream:type_name -> encore.engine.trace2.BodyStream - 20, // 25: encore.engine.trace2.SpanEvent.rpc_call_start:type_name -> encore.engine.trace2.RPCCallStart - 21, // 26: encore.engine.trace2.SpanEvent.rpc_call_end:type_name -> encore.engine.trace2.RPCCallEnd - 24, // 27: encore.engine.trace2.SpanEvent.db_transaction_start:type_name -> encore.engine.trace2.DBTransactionStart - 25, // 28: encore.engine.trace2.SpanEvent.db_transaction_end:type_name -> encore.engine.trace2.DBTransactionEnd - 26, // 29: encore.engine.trace2.SpanEvent.db_query_start:type_name -> encore.engine.trace2.DBQueryStart - 27, // 30: encore.engine.trace2.SpanEvent.db_query_end:type_name -> encore.engine.trace2.DBQueryEnd - 35, // 31: encore.engine.trace2.SpanEvent.http_call_start:type_name -> encore.engine.trace2.HTTPCallStart - 36, // 32: encore.engine.trace2.SpanEvent.http_call_end:type_name -> encore.engine.trace2.HTTPCallEnd - 28, // 33: encore.engine.trace2.SpanEvent.pubsub_publish_start:type_name -> encore.engine.trace2.PubsubPublishStart - 29, // 34: encore.engine.trace2.SpanEvent.pubsub_publish_end:type_name -> encore.engine.trace2.PubsubPublishEnd - 32, // 35: encore.engine.trace2.SpanEvent.cache_call_start:type_name -> encore.engine.trace2.CacheCallStart - 33, // 36: encore.engine.trace2.SpanEvent.cache_call_end:type_name -> encore.engine.trace2.CacheCallEnd - 30, // 37: encore.engine.trace2.SpanEvent.service_init_start:type_name -> encore.engine.trace2.ServiceInitStart - 31, // 38: encore.engine.trace2.SpanEvent.service_init_end:type_name -> encore.engine.trace2.ServiceInitEnd - 55, // 39: encore.engine.trace2.RPCCallStart.stack:type_name -> encore.engine.trace2.StackTrace - 57, // 40: encore.engine.trace2.RPCCallEnd.err:type_name -> encore.engine.trace2.Error - 55, // 41: encore.engine.trace2.DBTransactionStart.stack:type_name -> encore.engine.trace2.StackTrace - 2, // 42: encore.engine.trace2.DBTransactionEnd.completion:type_name -> encore.engine.trace2.DBTransactionEnd.CompletionType - 55, // 43: encore.engine.trace2.DBTransactionEnd.stack:type_name -> encore.engine.trace2.StackTrace - 57, // 44: encore.engine.trace2.DBTransactionEnd.err:type_name -> encore.engine.trace2.Error - 55, // 45: encore.engine.trace2.DBQueryStart.stack:type_name -> encore.engine.trace2.StackTrace - 57, // 46: encore.engine.trace2.DBQueryEnd.err:type_name -> encore.engine.trace2.Error - 55, // 47: encore.engine.trace2.PubsubPublishStart.stack:type_name -> encore.engine.trace2.StackTrace - 57, // 48: encore.engine.trace2.PubsubPublishEnd.err:type_name -> encore.engine.trace2.Error - 57, // 49: encore.engine.trace2.ServiceInitEnd.err:type_name -> encore.engine.trace2.Error - 55, // 50: encore.engine.trace2.CacheCallStart.stack:type_name -> encore.engine.trace2.StackTrace - 3, // 51: encore.engine.trace2.CacheCallEnd.result:type_name -> encore.engine.trace2.CacheCallEnd.Result - 57, // 52: encore.engine.trace2.CacheCallEnd.err:type_name -> encore.engine.trace2.Error - 55, // 53: encore.engine.trace2.HTTPCallStart.stack:type_name -> encore.engine.trace2.StackTrace - 57, // 54: encore.engine.trace2.HTTPCallEnd.err:type_name -> encore.engine.trace2.Error - 37, // 55: encore.engine.trace2.HTTPCallEnd.trace_events:type_name -> encore.engine.trace2.HTTPTraceEvent - 38, // 56: encore.engine.trace2.HTTPTraceEvent.get_conn:type_name -> encore.engine.trace2.HTTPGetConn - 39, // 57: encore.engine.trace2.HTTPTraceEvent.got_conn:type_name -> encore.engine.trace2.HTTPGotConn - 40, // 58: encore.engine.trace2.HTTPTraceEvent.got_first_response_byte:type_name -> encore.engine.trace2.HTTPGotFirstResponseByte - 41, // 59: encore.engine.trace2.HTTPTraceEvent.got_1xx_response:type_name -> encore.engine.trace2.HTTPGot1xxResponse - 42, // 60: encore.engine.trace2.HTTPTraceEvent.dns_start:type_name -> encore.engine.trace2.HTTPDNSStart - 43, // 61: encore.engine.trace2.HTTPTraceEvent.dns_done:type_name -> encore.engine.trace2.HTTPDNSDone - 45, // 62: encore.engine.trace2.HTTPTraceEvent.connect_start:type_name -> encore.engine.trace2.HTTPConnectStart - 46, // 63: encore.engine.trace2.HTTPTraceEvent.connect_done:type_name -> encore.engine.trace2.HTTPConnectDone - 47, // 64: encore.engine.trace2.HTTPTraceEvent.tls_handshake_start:type_name -> encore.engine.trace2.HTTPTLSHandshakeStart - 48, // 65: encore.engine.trace2.HTTPTraceEvent.tls_handshake_done:type_name -> encore.engine.trace2.HTTPTLSHandshakeDone - 49, // 66: encore.engine.trace2.HTTPTraceEvent.wrote_headers:type_name -> encore.engine.trace2.HTTPWroteHeaders - 50, // 67: encore.engine.trace2.HTTPTraceEvent.wrote_request:type_name -> encore.engine.trace2.HTTPWroteRequest - 51, // 68: encore.engine.trace2.HTTPTraceEvent.wait_100_continue:type_name -> encore.engine.trace2.HTTPWait100Continue - 52, // 69: encore.engine.trace2.HTTPTraceEvent.closed_body:type_name -> encore.engine.trace2.HTTPClosedBodyData - 44, // 70: encore.engine.trace2.HTTPDNSDone.addrs:type_name -> encore.engine.trace2.DNSAddr - 4, // 71: encore.engine.trace2.LogMessage.level:type_name -> encore.engine.trace2.LogMessage.Level - 54, // 72: encore.engine.trace2.LogMessage.fields:type_name -> encore.engine.trace2.LogField - 55, // 73: encore.engine.trace2.LogMessage.stack:type_name -> encore.engine.trace2.StackTrace - 57, // 74: encore.engine.trace2.LogField.error:type_name -> encore.engine.trace2.Error - 60, // 75: encore.engine.trace2.LogField.time:type_name -> google.protobuf.Timestamp - 56, // 76: encore.engine.trace2.StackTrace.frames:type_name -> encore.engine.trace2.StackFrame - 55, // 77: encore.engine.trace2.Error.stack:type_name -> encore.engine.trace2.StackTrace - 78, // [78:78] is the sub-list for method output_type - 78, // [78:78] is the sub-list for method input_type - 78, // [78:78] is the sub-list for extension type_name - 78, // [78:78] is the sub-list for extension extendee - 0, // [0:78] is the sub-list for field type_name + 64, // 1: encore.engine.trace2.SpanSummary.started_at:type_name -> google.protobuf.Timestamp + 9, // 2: encore.engine.trace2.EventList.events:type_name -> encore.engine.trace2.TraceEvent + 7, // 3: encore.engine.trace2.TraceEvent.trace_id:type_name -> encore.engine.trace2.TraceID + 64, // 4: encore.engine.trace2.TraceEvent.event_time:type_name -> google.protobuf.Timestamp + 10, // 5: encore.engine.trace2.TraceEvent.span_start:type_name -> encore.engine.trace2.SpanStart + 11, // 6: encore.engine.trace2.TraceEvent.span_end:type_name -> encore.engine.trace2.SpanEnd + 22, // 7: encore.engine.trace2.TraceEvent.span_event:type_name -> encore.engine.trace2.SpanEvent + 7, // 8: encore.engine.trace2.SpanStart.parent_trace_id:type_name -> encore.engine.trace2.TraceID + 12, // 9: encore.engine.trace2.SpanStart.request:type_name -> encore.engine.trace2.RequestSpanStart + 14, // 10: encore.engine.trace2.SpanStart.auth:type_name -> encore.engine.trace2.AuthSpanStart + 16, // 11: encore.engine.trace2.SpanStart.pubsub_message:type_name -> encore.engine.trace2.PubsubMessageSpanStart + 18, // 12: encore.engine.trace2.SpanStart.test:type_name -> encore.engine.trace2.TestSpanStart + 20, // 13: encore.engine.trace2.SpanStart.generic:type_name -> encore.engine.trace2.GenericSpanStart + 61, // 14: encore.engine.trace2.SpanEnd.error:type_name -> encore.engine.trace2.Error + 59, // 15: encore.engine.trace2.SpanEnd.panic_stack:type_name -> encore.engine.trace2.StackTrace + 7, // 16: encore.engine.trace2.SpanEnd.parent_trace_id:type_name -> encore.engine.trace2.TraceID + 13, // 17: encore.engine.trace2.SpanEnd.request:type_name -> encore.engine.trace2.RequestSpanEnd + 15, // 18: encore.engine.trace2.SpanEnd.auth:type_name -> encore.engine.trace2.AuthSpanEnd + 17, // 19: encore.engine.trace2.SpanEnd.pubsub_message:type_name -> encore.engine.trace2.PubsubMessageSpanEnd + 19, // 20: encore.engine.trace2.SpanEnd.test:type_name -> encore.engine.trace2.TestSpanEnd + 21, // 21: encore.engine.trace2.SpanEnd.generic:type_name -> encore.engine.trace2.GenericSpanEnd + 62, // 22: encore.engine.trace2.RequestSpanStart.request_headers:type_name -> encore.engine.trace2.RequestSpanStart.RequestHeadersEntry + 63, // 23: encore.engine.trace2.RequestSpanEnd.response_headers:type_name -> encore.engine.trace2.RequestSpanEnd.ResponseHeadersEntry + 64, // 24: encore.engine.trace2.PubsubMessageSpanStart.publish_time:type_name -> google.protobuf.Timestamp + 2, // 25: encore.engine.trace2.GenericSpanStart.kind:type_name -> encore.engine.trace2.GenericSpanStart.Kind + 64, // 26: encore.engine.trace2.GenericSpanStart.time:type_name -> google.protobuf.Timestamp + 58, // 27: encore.engine.trace2.GenericSpanStart.attributes:type_name -> encore.engine.trace2.LogField + 59, // 28: encore.engine.trace2.GenericSpanStart.stack:type_name -> encore.engine.trace2.StackTrace + 64, // 29: encore.engine.trace2.GenericSpanEnd.time:type_name -> google.protobuf.Timestamp + 58, // 30: encore.engine.trace2.GenericSpanEnd.attributes:type_name -> encore.engine.trace2.LogField + 59, // 31: encore.engine.trace2.GenericSpanEnd.stack:type_name -> encore.engine.trace2.StackTrace + 57, // 32: encore.engine.trace2.SpanEvent.log_message:type_name -> encore.engine.trace2.LogMessage + 38, // 33: encore.engine.trace2.SpanEvent.body_stream:type_name -> encore.engine.trace2.BodyStream + 23, // 34: encore.engine.trace2.SpanEvent.rpc_call_start:type_name -> encore.engine.trace2.RPCCallStart + 24, // 35: encore.engine.trace2.SpanEvent.rpc_call_end:type_name -> encore.engine.trace2.RPCCallEnd + 27, // 36: encore.engine.trace2.SpanEvent.db_transaction_start:type_name -> encore.engine.trace2.DBTransactionStart + 28, // 37: encore.engine.trace2.SpanEvent.db_transaction_end:type_name -> encore.engine.trace2.DBTransactionEnd + 29, // 38: encore.engine.trace2.SpanEvent.db_query_start:type_name -> encore.engine.trace2.DBQueryStart + 30, // 39: encore.engine.trace2.SpanEvent.db_query_end:type_name -> encore.engine.trace2.DBQueryEnd + 39, // 40: encore.engine.trace2.SpanEvent.http_call_start:type_name -> encore.engine.trace2.HTTPCallStart + 40, // 41: encore.engine.trace2.SpanEvent.http_call_end:type_name -> encore.engine.trace2.HTTPCallEnd + 31, // 42: encore.engine.trace2.SpanEvent.pubsub_publish_start:type_name -> encore.engine.trace2.PubsubPublishStart + 32, // 43: encore.engine.trace2.SpanEvent.pubsub_publish_end:type_name -> encore.engine.trace2.PubsubPublishEnd + 35, // 44: encore.engine.trace2.SpanEvent.cache_call_start:type_name -> encore.engine.trace2.CacheCallStart + 36, // 45: encore.engine.trace2.SpanEvent.cache_call_end:type_name -> encore.engine.trace2.CacheCallEnd + 33, // 46: encore.engine.trace2.SpanEvent.service_init_start:type_name -> encore.engine.trace2.ServiceInitStart + 34, // 47: encore.engine.trace2.SpanEvent.service_init_end:type_name -> encore.engine.trace2.ServiceInitEnd + 37, // 48: encore.engine.trace2.SpanEvent.generic_event:type_name -> encore.engine.trace2.GenericEvent + 59, // 49: encore.engine.trace2.RPCCallStart.stack:type_name -> encore.engine.trace2.StackTrace + 61, // 50: encore.engine.trace2.RPCCallEnd.err:type_name -> encore.engine.trace2.Error + 59, // 51: encore.engine.trace2.DBTransactionStart.stack:type_name -> encore.engine.trace2.StackTrace + 3, // 52: encore.engine.trace2.DBTransactionEnd.completion:type_name -> encore.engine.trace2.DBTransactionEnd.CompletionType + 59, // 53: encore.engine.trace2.DBTransactionEnd.stack:type_name -> encore.engine.trace2.StackTrace + 61, // 54: encore.engine.trace2.DBTransactionEnd.err:type_name -> encore.engine.trace2.Error + 59, // 55: encore.engine.trace2.DBQueryStart.stack:type_name -> encore.engine.trace2.StackTrace + 61, // 56: encore.engine.trace2.DBQueryEnd.err:type_name -> encore.engine.trace2.Error + 59, // 57: encore.engine.trace2.PubsubPublishStart.stack:type_name -> encore.engine.trace2.StackTrace + 61, // 58: encore.engine.trace2.PubsubPublishEnd.err:type_name -> encore.engine.trace2.Error + 61, // 59: encore.engine.trace2.ServiceInitEnd.err:type_name -> encore.engine.trace2.Error + 59, // 60: encore.engine.trace2.CacheCallStart.stack:type_name -> encore.engine.trace2.StackTrace + 4, // 61: encore.engine.trace2.CacheCallEnd.result:type_name -> encore.engine.trace2.CacheCallEnd.Result + 61, // 62: encore.engine.trace2.CacheCallEnd.err:type_name -> encore.engine.trace2.Error + 64, // 63: encore.engine.trace2.GenericEvent.time:type_name -> google.protobuf.Timestamp + 61, // 64: encore.engine.trace2.GenericEvent.error:type_name -> encore.engine.trace2.Error + 58, // 65: encore.engine.trace2.GenericEvent.attributes:type_name -> encore.engine.trace2.LogField + 59, // 66: encore.engine.trace2.GenericEvent.stack:type_name -> encore.engine.trace2.StackTrace + 59, // 67: encore.engine.trace2.HTTPCallStart.stack:type_name -> encore.engine.trace2.StackTrace + 61, // 68: encore.engine.trace2.HTTPCallEnd.err:type_name -> encore.engine.trace2.Error + 41, // 69: encore.engine.trace2.HTTPCallEnd.trace_events:type_name -> encore.engine.trace2.HTTPTraceEvent + 42, // 70: encore.engine.trace2.HTTPTraceEvent.get_conn:type_name -> encore.engine.trace2.HTTPGetConn + 43, // 71: encore.engine.trace2.HTTPTraceEvent.got_conn:type_name -> encore.engine.trace2.HTTPGotConn + 44, // 72: encore.engine.trace2.HTTPTraceEvent.got_first_response_byte:type_name -> encore.engine.trace2.HTTPGotFirstResponseByte + 45, // 73: encore.engine.trace2.HTTPTraceEvent.got_1xx_response:type_name -> encore.engine.trace2.HTTPGot1xxResponse + 46, // 74: encore.engine.trace2.HTTPTraceEvent.dns_start:type_name -> encore.engine.trace2.HTTPDNSStart + 47, // 75: encore.engine.trace2.HTTPTraceEvent.dns_done:type_name -> encore.engine.trace2.HTTPDNSDone + 49, // 76: encore.engine.trace2.HTTPTraceEvent.connect_start:type_name -> encore.engine.trace2.HTTPConnectStart + 50, // 77: encore.engine.trace2.HTTPTraceEvent.connect_done:type_name -> encore.engine.trace2.HTTPConnectDone + 51, // 78: encore.engine.trace2.HTTPTraceEvent.tls_handshake_start:type_name -> encore.engine.trace2.HTTPTLSHandshakeStart + 52, // 79: encore.engine.trace2.HTTPTraceEvent.tls_handshake_done:type_name -> encore.engine.trace2.HTTPTLSHandshakeDone + 53, // 80: encore.engine.trace2.HTTPTraceEvent.wrote_headers:type_name -> encore.engine.trace2.HTTPWroteHeaders + 54, // 81: encore.engine.trace2.HTTPTraceEvent.wrote_request:type_name -> encore.engine.trace2.HTTPWroteRequest + 55, // 82: encore.engine.trace2.HTTPTraceEvent.wait_100_continue:type_name -> encore.engine.trace2.HTTPWait100Continue + 56, // 83: encore.engine.trace2.HTTPTraceEvent.closed_body:type_name -> encore.engine.trace2.HTTPClosedBodyData + 48, // 84: encore.engine.trace2.HTTPDNSDone.addrs:type_name -> encore.engine.trace2.DNSAddr + 5, // 85: encore.engine.trace2.LogMessage.level:type_name -> encore.engine.trace2.LogMessage.Level + 58, // 86: encore.engine.trace2.LogMessage.fields:type_name -> encore.engine.trace2.LogField + 59, // 87: encore.engine.trace2.LogMessage.stack:type_name -> encore.engine.trace2.StackTrace + 61, // 88: encore.engine.trace2.LogField.error:type_name -> encore.engine.trace2.Error + 64, // 89: encore.engine.trace2.LogField.time:type_name -> google.protobuf.Timestamp + 60, // 90: encore.engine.trace2.StackTrace.frames:type_name -> encore.engine.trace2.StackFrame + 59, // 91: encore.engine.trace2.Error.stack:type_name -> encore.engine.trace2.StackTrace + 92, // [92:92] is the sub-list for method output_type + 92, // [92:92] is the sub-list for method input_type + 92, // [92:92] is the sub-list for extension type_name + 92, // [92:92] is the sub-list for extension extendee + 0, // [0:92] is the sub-list for field type_name } func init() { file_encore_engine_trace2_trace2_proto_init() } @@ -5448,7 +5856,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SpanEvent); i { + switch v := v.(*GenericSpanStart); i { case 0: return &v.state case 1: @@ -5460,7 +5868,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RPCCallStart); i { + switch v := v.(*GenericSpanEnd); i { case 0: return &v.state case 1: @@ -5472,7 +5880,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RPCCallEnd); i { + switch v := v.(*SpanEvent); i { case 0: return &v.state case 1: @@ -5484,7 +5892,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GoroutineStart); i { + switch v := v.(*RPCCallStart); i { case 0: return &v.state case 1: @@ -5496,7 +5904,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GoroutineEnd); i { + switch v := v.(*RPCCallEnd); i { case 0: return &v.state case 1: @@ -5508,7 +5916,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DBTransactionStart); i { + switch v := v.(*GoroutineStart); i { case 0: return &v.state case 1: @@ -5520,7 +5928,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DBTransactionEnd); i { + switch v := v.(*GoroutineEnd); i { case 0: return &v.state case 1: @@ -5532,7 +5940,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DBQueryStart); i { + switch v := v.(*DBTransactionStart); i { case 0: return &v.state case 1: @@ -5544,7 +5952,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DBQueryEnd); i { + switch v := v.(*DBTransactionEnd); i { case 0: return &v.state case 1: @@ -5556,7 +5964,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PubsubPublishStart); i { + switch v := v.(*DBQueryStart); i { case 0: return &v.state case 1: @@ -5568,7 +5976,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PubsubPublishEnd); i { + switch v := v.(*DBQueryEnd); i { case 0: return &v.state case 1: @@ -5580,7 +5988,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceInitStart); i { + switch v := v.(*PubsubPublishStart); i { case 0: return &v.state case 1: @@ -5592,7 +6000,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceInitEnd); i { + switch v := v.(*PubsubPublishEnd); i { case 0: return &v.state case 1: @@ -5604,7 +6012,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CacheCallStart); i { + switch v := v.(*ServiceInitStart); i { case 0: return &v.state case 1: @@ -5616,7 +6024,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CacheCallEnd); i { + switch v := v.(*ServiceInitEnd); i { case 0: return &v.state case 1: @@ -5628,7 +6036,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BodyStream); i { + switch v := v.(*CacheCallStart); i { case 0: return &v.state case 1: @@ -5640,7 +6048,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPCallStart); i { + switch v := v.(*CacheCallEnd); i { case 0: return &v.state case 1: @@ -5652,7 +6060,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPCallEnd); i { + switch v := v.(*GenericEvent); i { case 0: return &v.state case 1: @@ -5664,7 +6072,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPTraceEvent); i { + switch v := v.(*BodyStream); i { case 0: return &v.state case 1: @@ -5676,7 +6084,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPGetConn); i { + switch v := v.(*HTTPCallStart); i { case 0: return &v.state case 1: @@ -5688,7 +6096,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPGotConn); i { + switch v := v.(*HTTPCallEnd); i { case 0: return &v.state case 1: @@ -5700,7 +6108,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPGotFirstResponseByte); i { + switch v := v.(*HTTPTraceEvent); i { case 0: return &v.state case 1: @@ -5712,7 +6120,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPGot1XxResponse); i { + switch v := v.(*HTTPGetConn); i { case 0: return &v.state case 1: @@ -5724,7 +6132,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPDNSStart); i { + switch v := v.(*HTTPGotConn); i { case 0: return &v.state case 1: @@ -5736,7 +6144,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPDNSDone); i { + switch v := v.(*HTTPGotFirstResponseByte); i { case 0: return &v.state case 1: @@ -5748,7 +6156,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSAddr); i { + switch v := v.(*HTTPGot1XxResponse); i { case 0: return &v.state case 1: @@ -5760,7 +6168,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPConnectStart); i { + switch v := v.(*HTTPDNSStart); i { case 0: return &v.state case 1: @@ -5772,7 +6180,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPConnectDone); i { + switch v := v.(*HTTPDNSDone); i { case 0: return &v.state case 1: @@ -5784,7 +6192,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPTLSHandshakeStart); i { + switch v := v.(*DNSAddr); i { case 0: return &v.state case 1: @@ -5796,7 +6204,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPTLSHandshakeDone); i { + switch v := v.(*HTTPConnectStart); i { case 0: return &v.state case 1: @@ -5808,7 +6216,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPWroteHeaders); i { + switch v := v.(*HTTPConnectDone); i { case 0: return &v.state case 1: @@ -5820,7 +6228,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPWroteRequest); i { + switch v := v.(*HTTPTLSHandshakeStart); i { case 0: return &v.state case 1: @@ -5832,7 +6240,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPWait100Continue); i { + switch v := v.(*HTTPTLSHandshakeDone); i { case 0: return &v.state case 1: @@ -5844,7 +6252,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPClosedBodyData); i { + switch v := v.(*HTTPWroteHeaders); i { case 0: return &v.state case 1: @@ -5856,7 +6264,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogMessage); i { + switch v := v.(*HTTPWroteRequest); i { case 0: return &v.state case 1: @@ -5868,7 +6276,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogField); i { + switch v := v.(*HTTPWait100Continue); i { case 0: return &v.state case 1: @@ -5880,7 +6288,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StackTrace); i { + switch v := v.(*HTTPClosedBodyData); i { case 0: return &v.state case 1: @@ -5892,7 +6300,7 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StackFrame); i { + switch v := v.(*LogMessage); i { case 0: return &v.state case 1: @@ -5904,6 +6312,42 @@ func file_encore_engine_trace2_trace2_proto_init() { } } file_encore_engine_trace2_trace2_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LogField); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_encore_engine_trace2_trace2_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StackTrace); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_encore_engine_trace2_trace2_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StackFrame); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_encore_engine_trace2_trace2_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Error); i { case 0: return &v.state @@ -5927,19 +6371,21 @@ func file_encore_engine_trace2_trace2_proto_init() { (*SpanStart_Auth)(nil), (*SpanStart_PubsubMessage)(nil), (*SpanStart_Test)(nil), + (*SpanStart_Generic)(nil), } file_encore_engine_trace2_trace2_proto_msgTypes[5].OneofWrappers = []interface{}{ (*SpanEnd_Request)(nil), (*SpanEnd_Auth)(nil), (*SpanEnd_PubsubMessage)(nil), (*SpanEnd_Test)(nil), + (*SpanEnd_Generic)(nil), } file_encore_engine_trace2_trace2_proto_msgTypes[6].OneofWrappers = []interface{}{} file_encore_engine_trace2_trace2_proto_msgTypes[7].OneofWrappers = []interface{}{} file_encore_engine_trace2_trace2_proto_msgTypes[8].OneofWrappers = []interface{}{} file_encore_engine_trace2_trace2_proto_msgTypes[9].OneofWrappers = []interface{}{} file_encore_engine_trace2_trace2_proto_msgTypes[10].OneofWrappers = []interface{}{} - file_encore_engine_trace2_trace2_proto_msgTypes[14].OneofWrappers = []interface{}{ + file_encore_engine_trace2_trace2_proto_msgTypes[16].OneofWrappers = []interface{}{ (*SpanEvent_LogMessage)(nil), (*SpanEvent_BodyStream)(nil), (*SpanEvent_RpcCallStart)(nil), @@ -5956,15 +6402,16 @@ func file_encore_engine_trace2_trace2_proto_init() { (*SpanEvent_CacheCallEnd)(nil), (*SpanEvent_ServiceInitStart)(nil), (*SpanEvent_ServiceInitEnd)(nil), + (*SpanEvent_GenericEvent)(nil), } - file_encore_engine_trace2_trace2_proto_msgTypes[16].OneofWrappers = []interface{}{} - file_encore_engine_trace2_trace2_proto_msgTypes[20].OneofWrappers = []interface{}{} + file_encore_engine_trace2_trace2_proto_msgTypes[18].OneofWrappers = []interface{}{} file_encore_engine_trace2_trace2_proto_msgTypes[22].OneofWrappers = []interface{}{} file_encore_engine_trace2_trace2_proto_msgTypes[24].OneofWrappers = []interface{}{} file_encore_engine_trace2_trace2_proto_msgTypes[26].OneofWrappers = []interface{}{} file_encore_engine_trace2_trace2_proto_msgTypes[28].OneofWrappers = []interface{}{} - file_encore_engine_trace2_trace2_proto_msgTypes[31].OneofWrappers = []interface{}{} - file_encore_engine_trace2_trace2_proto_msgTypes[32].OneofWrappers = []interface{}{ + file_encore_engine_trace2_trace2_proto_msgTypes[30].OneofWrappers = []interface{}{} + file_encore_engine_trace2_trace2_proto_msgTypes[34].OneofWrappers = []interface{}{} + file_encore_engine_trace2_trace2_proto_msgTypes[35].OneofWrappers = []interface{}{ (*HTTPTraceEvent_GetConn)(nil), (*HTTPTraceEvent_GotConn)(nil), (*HTTPTraceEvent_GotFirstResponseByte)(nil), @@ -5980,11 +6427,11 @@ func file_encore_engine_trace2_trace2_proto_init() { (*HTTPTraceEvent_Wait_100Continue)(nil), (*HTTPTraceEvent_ClosedBody)(nil), } - file_encore_engine_trace2_trace2_proto_msgTypes[38].OneofWrappers = []interface{}{} - file_encore_engine_trace2_trace2_proto_msgTypes[43].OneofWrappers = []interface{}{} - file_encore_engine_trace2_trace2_proto_msgTypes[45].OneofWrappers = []interface{}{} - file_encore_engine_trace2_trace2_proto_msgTypes[47].OneofWrappers = []interface{}{} - file_encore_engine_trace2_trace2_proto_msgTypes[49].OneofWrappers = []interface{}{ + file_encore_engine_trace2_trace2_proto_msgTypes[41].OneofWrappers = []interface{}{} + file_encore_engine_trace2_trace2_proto_msgTypes[46].OneofWrappers = []interface{}{} + file_encore_engine_trace2_trace2_proto_msgTypes[48].OneofWrappers = []interface{}{} + file_encore_engine_trace2_trace2_proto_msgTypes[50].OneofWrappers = []interface{}{} + file_encore_engine_trace2_trace2_proto_msgTypes[52].OneofWrappers = []interface{}{ (*LogField_Error)(nil), (*LogField_Str)(nil), (*LogField_Bool)(nil), @@ -5997,14 +6444,14 @@ func file_encore_engine_trace2_trace2_proto_init() { (*LogField_Float32)(nil), (*LogField_Float64)(nil), } - file_encore_engine_trace2_trace2_proto_msgTypes[52].OneofWrappers = []interface{}{} + file_encore_engine_trace2_trace2_proto_msgTypes[55].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_encore_engine_trace2_trace2_proto_rawDesc, - NumEnums: 5, - NumMessages: 55, + NumEnums: 6, + NumMessages: 58, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/encore/engine/trace2/trace2.proto b/proto/encore/engine/trace2/trace2.proto index 7d1b02cc2b..89b5ce2511 100644 --- a/proto/encore/engine/trace2/trace2.proto +++ b/proto/encore/engine/trace2/trace2.proto @@ -31,6 +31,7 @@ message SpanSummary { AUTH = 2; PUBSUB_MESSAGE = 3; TEST = 4; + GENERIC_SPAN = 5; } } @@ -69,6 +70,7 @@ message SpanStart { AuthSpanStart auth = 11; PubsubMessageSpanStart pubsub_message = 12; TestSpanStart test = 13; + GenericSpanStart generic = 14; } } @@ -85,6 +87,7 @@ message SpanEnd { AuthSpanEnd auth = 11; PubsubMessageSpanEnd pubsub_message = 12; TestSpanEnd test = 13; + GenericSpanEnd generic = 14; } } @@ -162,6 +165,29 @@ message TestSpanEnd { bool skipped = 4; } +message GenericSpanStart { + string span_name = 1; + Kind kind = 2; + google.protobuf.Timestamp time = 3; + repeated LogField attributes = 4; + StackTrace stack = 5; + + enum Kind { + UNKNOWN = 0; + INTERNAL = 1; + REQUEST = 2; + CALL = 3; + PRODUCER = 4; + CONSUMER = 5; + } +} + +message GenericSpanEnd { + google.protobuf.Timestamp time = 1; + repeated LogField attributes = 2; + StackTrace stack = 3; +} + message SpanEvent { uint32 goid = 1; optional uint32 def_loc = 2; @@ -187,6 +213,7 @@ message SpanEvent { CacheCallEnd cache_call_end = 23; ServiceInitStart service_init_start = 24; ServiceInitEnd service_init_end = 25; + GenericEvent generic_event = 26; } } @@ -268,6 +295,14 @@ message CacheCallEnd { } } +message GenericEvent { + string event_name = 1; + google.protobuf.Timestamp time = 2; + Error error = 3; + repeated LogField attributes = 4; + StackTrace stack = 5; +} + message BodyStream { bool is_response = 1; bool overflowed = 2; diff --git a/runtimes/go/appruntime/apisdk/api/reqtrack.go b/runtimes/go/appruntime/apisdk/api/reqtrack.go index 1f8df3dcdd..ac92019b65 100644 --- a/runtimes/go/appruntime/apisdk/api/reqtrack.go +++ b/runtimes/go/appruntime/apisdk/api/reqtrack.go @@ -110,7 +110,7 @@ func (s *Server) beginRequest(ctx context.Context, p *beginRequestParams) (*mode } // Begin the request, copying data over from the previous request. - s.rt.BeginRequest(req) + s.rt.BeginRequest(req, false) if curr := s.rt.Current(); curr.Trace != nil { switch req.Type { case model.RPCCall: diff --git a/runtimes/go/appruntime/exported/model/request.go b/runtimes/go/appruntime/exported/model/request.go index 5f4f7ab541..77ea74effc 100644 --- a/runtimes/go/appruntime/exported/model/request.go +++ b/runtimes/go/appruntime/exported/model/request.go @@ -16,6 +16,7 @@ type TraceEventID uint64 type RequestType byte const ( + Unknown RequestType = 0x00 RPCCall RequestType = 0x01 AuthHandler RequestType = 0x02 PubSubMessage RequestType = 0x03 diff --git a/runtimes/go/appruntime/exported/trace2/events.go b/runtimes/go/appruntime/exported/trace2/events.go index 6e3619aad7..c337642aab 100644 --- a/runtimes/go/appruntime/exported/trace2/events.go +++ b/runtimes/go/appruntime/exported/trace2/events.go @@ -40,6 +40,9 @@ const ( BodyStream EventType = 0x16 TestStart EventType = 0x17 TestEnd EventType = 0x18 + GenericSpanStart EventType = 0x19 + GenericSpanEnd EventType = 0x1A + GenericEvent EventType = 0x1B ) func (te EventType) String() string { @@ -401,6 +404,132 @@ func (l *Log) TestSpanEnd(p TestSpanEndParams) { }) } +type GenericSpanKind int8 + +const ( + GenericSpanKindUnknown GenericSpanKind = iota + GenericSpanKindInternal + GenericSpanKindRequest + GenericSpanKindCall + GenericSpanKindProducer + GenericSpanKindConsumer +) + +type GenericSpanStartParams struct { + EventParams + Name string + Kind GenericSpanKind + Time time.Time + Attributes []LogField + StackDepth int // negative means don't capture stack, positive means capture stack at that depth +} + +func (l *Log) GenericSpanStart(req *model.Request, data GenericSpanStartParams, goid uint32) { + tb := l.newSpanStartEvent(spanStartEventData{ + ParentTraceID: req.ParentTraceID, + ParentSpanID: req.ParentSpanID, + DefLoc: req.DefLoc, + Goid: goid, + CallerEventID: req.CallerEventID, + ExtCorrelationID: req.ExtCorrelationID, + ExtraSpace: len(data.Name) + 1 + 4 + 64*len(data.Attributes) + 100, + }) + + tb.String(data.Name) + tb.Byte(byte(data.Kind)) + tb.Time(data.Time) + tb.UVarint(uint64(len(data.Attributes))) + for _, f := range data.Attributes { + addLogField(&tb, f.Key, f.Value) + } + if data.StackDepth < 0 { + tb.Stack(stack.Stack{}) // empty stack + } else { + tb.Stack(stack.Build(data.StackDepth + 1)) + } + + l.Add(Event{ + Type: GenericSpanStart, + TraceID: req.TraceID, + SpanID: req.SpanID, + Data: tb, + }) +} + +type GenericSpanEndParams struct { + EventParams + Time time.Time + Error error + Attributes []LogField + StackDepth int // negative means don't capture stack, positive means capture stack at that depth +} + +func (l *Log) GenericSpanEnd(req *model.Request, data GenericSpanEndParams) { + tb := l.newSpanEndEvent(spanEndEventData{ + Duration: data.Time.Sub(req.Start), + Err: data.Error, + ParentTraceID: req.ParentTraceID, + ParentSpanID: req.ParentSpanID, + ExtraSpace: 64*len(data.Attributes) + 100, + }) + + tb.Time(data.Time) + + tb.UVarint(uint64(len(data.Attributes))) + for _, f := range data.Attributes { + addLogField(&tb, f.Key, f.Value) + } + if data.StackDepth < 0 { + tb.Stack(stack.Stack{}) // empty stack + } else { + tb.Stack(stack.Build(data.StackDepth + 1)) + } + + l.Add(Event{ + Type: GenericSpanEnd, + TraceID: data.TraceID, + SpanID: data.SpanID, + Data: tb, + }) +} + +type GenericEventParams struct { + EventParams + Name string + Time time.Time + Error error + Attributes []LogField + StackDepth int // negative means don't capture stack, positive means capture stack at that depth +} + +func (l *Log) GenericEvent(data GenericEventParams) { + tb := l.newEvent(eventData{ + Common: data.EventParams, + ExtraSpace: len(data.Name) + 1 + 4 + 64*len(data.Attributes) + 100, + }) + + tb.String(data.Name) + tb.Time(data.Time) + tb.ErrWithStack(data.Error) + tb.UVarint(uint64(len(data.Attributes))) + for _, f := range data.Attributes { + addLogField(&tb, f.Key, f.Value) + } + if data.StackDepth < 0 { + tb.Stack(stack.Stack{}) // empty stack + } else { + tb.Stack(stack.Build(data.StackDepth + 1)) + } + + l.Add(Event{ + Type: GenericEvent, + TraceID: data.TraceID, + SpanID: data.SpanID, + Data: tb, + }) + +} + func (l *Log) RPCCallStart(call *model.APICall, goid uint32) EventID { tb := l.newEvent(eventData{ Common: EventParams{ diff --git a/runtimes/go/appruntime/exported/trace2/logger.go b/runtimes/go/appruntime/exported/trace2/logger.go index ff574d7aa7..0b2fa310ae 100644 --- a/runtimes/go/appruntime/exported/trace2/logger.go +++ b/runtimes/go/appruntime/exported/trace2/logger.go @@ -28,6 +28,9 @@ type Logger interface { PubsubMessageSpanEnd(params PubsubMessageSpanEndParams) TestSpanStart(req *model.Request, goid uint32) TestSpanEnd(params TestSpanEndParams) + GenericSpanStart(req *model.Request, params GenericSpanStartParams, goid uint32) + GenericSpanEnd(req *model.Request, params GenericSpanEndParams) + GenericEvent(params GenericEventParams) RPCCallStart(call *model.APICall, goid uint32) EventID RPCCallEnd(call *model.APICall, goid uint32, err error) DBQueryStart(p DBQueryStartParams) EventID diff --git a/runtimes/go/appruntime/shared/reqtrack/impl.go b/runtimes/go/appruntime/shared/reqtrack/impl.go index c47f346b61..5fd4058e6e 100644 --- a/runtimes/go/appruntime/shared/reqtrack/impl.go +++ b/runtimes/go/appruntime/shared/reqtrack/impl.go @@ -54,6 +54,8 @@ type encoreReq struct { spanID model2.SpanID // data is request-specific data defined in the Encore runtime. data *model2.Request + // previous request to restore, if any + prev *encoreReq } // beginOp begins a new Encore operation. @@ -133,9 +135,9 @@ func (op *encoreOp) decRef(blockOnTraceSend bool) int32 { // and increases the ref count on the operation. // If the g is not part of an op, it creates a new op // that is bound to the request lifetime. -func (t *RequestTracker) beginReq(data *model2.Request, trace bool) { +func (t *RequestTracker) beginReq(data *model2.Request, trace bool, toStack *encoreReq) { e := t.impl.get() - req := &encoreReq{spanID: data.SpanID, data: data} + req := &encoreReq{spanID: data.SpanID, data: data, prev: toStack} if e == nil { op := t.newOp(trace) t.tagG(op, req) @@ -161,7 +163,7 @@ func (t *RequestTracker) finishReq(blockOnTraceSend bool) { panic("encore.finishReq: no current request") } e.op.decRef(blockOnTraceSend) - e.req = nil + e.req = e.req.prev } func (t *RequestTracker) currentReq() (req *model2.Request, tr trace2.Logger, goctr uint32, svcNum uint16) { @@ -182,14 +184,16 @@ func (t *RequestTracker) currentReq() (req *model2.Request, tr trace2.Logger, go // encoreClearReq clears request data from the running g // without decrementing the ref count. // The g must be processing a request. -func (t *RequestTracker) clearReq() { +func (t *RequestTracker) clearReq() *encoreReq { e := t.impl.get() if e == nil { panic("encore.replaceReq: goroutine not in an operation") } else if e.req == nil { panic("encore.replaceReq: no current request") } + old := e.req e.req = nil + return old } //go:linkname nanotime runtime.nanotime diff --git a/runtimes/go/appruntime/shared/reqtrack/impl2.go b/runtimes/go/appruntime/shared/reqtrack/impl2.go new file mode 100644 index 0000000000..d974f59b73 --- /dev/null +++ b/runtimes/go/appruntime/shared/reqtrack/impl2.go @@ -0,0 +1,49 @@ +package reqtrack + +import ( + "sync/atomic" + + "encore.dev/appruntime/exported/model" +) + +// taggedGoroutine requests that a goroutine that we're tracking as part of an operation +// +// Note it is not thread safe and is only ever expected to be access by the goroutine it is associated to +type taggedGoroutine struct { + // id is the identifier assigned to this goroutine; + // it's only requirement is it must be unique within the associated operation + id uint32 + + // operation is the operation this goroutine is a part of + operation *trackedOperation + + // request is the request this goroutine is associated to + // + // Once set this is immutable until the go routine tag is removed + request *model.Request + + // spanID is the span ID of the span that this goroutine is associated to + activeSpan *trackedSpan +} + +type trackedOperation struct { + // id is the Trace ID assigned to this operation + id model.TraceID + + // nextGoroutineID is the next goroutine ID to assign when a Go routine is spawned + nextGoroutineID atomic.Uint32 +} + +func (op *trackedOperation) NextGoroutineID() uint32 { + return op.nextGoroutineID.Add(1) +} + +// trackedSpan represents a span that is part of an operation +type trackedSpan struct { + // id is the unique identifier assigned to this span + id model.SpanID + + parent *trackedSpan + + finished atomic.Bool +} diff --git a/runtimes/go/appruntime/shared/reqtrack/otel.go b/runtimes/go/appruntime/shared/reqtrack/otel.go new file mode 100644 index 0000000000..8b6a9e89a6 --- /dev/null +++ b/runtimes/go/appruntime/shared/reqtrack/otel.go @@ -0,0 +1,482 @@ +//go:build opentelemetry + +package reqtrack + +import ( + "context" + "fmt" + "sync" + "time" + + "github.com/go-logr/logr" + "github.com/rs/zerolog" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace" + "go.opentelemetry.io/otel/trace/noop" + + "encore.dev/appruntime/exported/model" + "encore.dev/appruntime/exported/trace2" +) + +// configureOpenTelemetry is a no-op when OpenTelemetry is not enabled. +// +// Our implementations of the OpenTelemetry API embed the noop implementations +// from the OpenTelemetry API. This means if the user forcibly updates the +// OpenTelemetry API to a version which has new methods, we will default to the +// noop implementation for those methods, rather than a compilation error (which +// would happen if we embedded `embedded.TracerProvider`) or panicing at runtime +// (which would happen if we embedded `trace.TracerProvider`). +func configureOpenTelemetry(reqTracker *RequestTracker) { + otel.SetErrorHandler(otel.ErrorHandlerFunc(func(err error) { + reqTracker.Logger().Err(err).Msg("an error occurred in the OpenTelemetry SDK") + })) + otel.SetLogger(logr.New(&logrSink{reqTracker: reqTracker})) + otel.SetTracerProvider(&otelTraceProvider{reqTracker: reqTracker}) +} + +// logrSink is a logr.LogSink that writes to our request logger. We need this because the OpenTelemetry library +// uses the logr library for logging. +type logrSink struct { + reqTracker *RequestTracker + name string + values []any + depth int +} + +var ( + _ logr.LogSink = &logrSink{} + _ logr.CallDepthLogSink = &logrSink{} +) + +// Init receives runtime info about the logr library. +func (ls *logrSink) Init(info logr.RuntimeInfo) { + ls.depth = info.CallDepth + 2 +} + +// Enabled tests whether this LogSink is enabled at the specified V-level. +func (ls *logrSink) Enabled(level int) bool { + zlvl := zerolog.Level(1 - level) + return zlvl >= ls.reqTracker.Logger().GetLevel() && zlvl >= zerolog.GlobalLevel() +} + +// Info logs a non-error message at specified V-level with the given key/value pairs as context. +func (ls *logrSink) Info(level int, msg string, keysAndValues ...any) { + logger := ls.reqTracker.Logger() + ev := logger.WithLevel(zerolog.Level(1 - level)) + ls.msg(ev, msg, keysAndValues) +} + +// Error logs an error, with the given message and key/value pairs as context. +func (ls *logrSink) Error(err error, msg string, keysAndValues ...any) { + logger := ls.reqTracker.Logger() + ev := logger.Err(err) + ls.msg(ev, msg, keysAndValues) +} + +// WithValues returns a new LogSink with additional key/value pairs. +func (ls *logrSink) WithValues(keysAndValues ...any) logr.LogSink { + return &logrSink{ + reqTracker: ls.reqTracker, + name: ls.name, + values: append(ls.values, keysAndValues...), + depth: ls.depth, + } +} + +// WithName returns a new LogSink with the specified name appended in NameFieldName. +// Name elements are separated by NameSeparator. +func (ls *logrSink) WithName(name string) logr.LogSink { + return &logrSink{ + reqTracker: ls.reqTracker, + name: name, + values: ls.values, + depth: ls.depth, + } +} + +// WithCallDepth returns a new LogSink that offsets the call stack by adding specified depths. +func (ls *logrSink) WithCallDepth(depth int) logr.LogSink { + return &logrSink{ + reqTracker: ls.reqTracker, + name: ls.name, + values: ls.values, + depth: ls.depth + depth, + } +} + +// msg is a helper function to log a message with the given key/value pairs as context. +func (ls *logrSink) msg(ev *zerolog.Event, msg string, keysAndValues []interface{}) { + if ev == nil { + return + } + if ls.name != "" { + ev.Str("logger", ls.name) + } + + for i, n := 1, len(keysAndValues); i < n; i += 2 { + value := keysAndValues[i] + switch v := value.(type) { + case logr.Marshaler: + keysAndValues[i] = v.MarshalLog() + case fmt.Stringer: + keysAndValues[i] = v.String() + } + } + + ev = ev.Fields(keysAndValues) + ev.CallerSkipFrame(ls.depth) + + ev.Msg(msg) +} + +type otelTraceProvider struct { + noop.TracerProvider + + // Our request tracker + reqTracker *RequestTracker +} + +func (o *otelTraceProvider) Tracer(name string, _ ...trace.TracerOption) trace.Tracer { + return &otelTracer{ + name: name, + provider: o, + } +} + +type otelTracer struct { + noop.Tracer + + name string + provider *otelTraceProvider +} + +func (o *otelTracer) Start(ctx context.Context, spanName string, opts ...trace.SpanStartOption) (context.Context, trace.Span) { + rt := o.provider.reqTracker + + var root bool + traceID, err := model.GenTraceID() + if err != nil { + rt.Logger().Err(err).Msg("failed to create TraceID for OpenTelemetry span; no span will be created") + return ctx, noop.Span{} + } + spanID, err := model.GenSpanID() + if err != nil { + rt.Logger().Err(err).Msg("failed to create SpanID for OpenTelemetry span; no span will be created") + return ctx, noop.Span{} + } + + // We need to know if this span is the root span or not. + // + // This would happen if the user calls `Start` directly on the tracer from a background goroutine. + // which isn't associated with a request. + if curr := rt.Current(); curr.Req == nil { + root = true + } + + otelData := &otelSpanData{} + req := &model.Request{ + Type: model.Unknown, + TraceID: traceID, + SpanID: spanID, + Start: time.Now(), + Logger: nil, + Traced: rt.TracingEnabled(), + } + + // Now apply the span start options to the request. + cfg := trace.NewSpanStartConfig(opts...) + + // NewRoot identifies a Span as the root Span for a new trace. This is + // commonly used when an existing trace crosses trust boundaries and the + // remote parent span context should be ignored for security. + if cfg.NewRoot() && !root { + rt.clearReq() + } + + // Note: beging request will mutate the request object and copy over + // the traceID and spanID from the current request if there is one. + rt.BeginRequest(req, true) + + // Now record this span starting + var traceLogger trace2.Logger + if curr := rt.Current(); curr.Trace != nil { + traceLogger = curr.Trace + + kind := trace2.GenericSpanKindUnknown + switch otelData.SpanKind { + case trace.SpanKindInternal: + kind = trace2.GenericSpanKindInternal + case trace.SpanKindServer: + kind = trace2.GenericSpanKindRequest + case trace.SpanKindClient: + kind = trace2.GenericSpanKindCall + case trace.SpanKindProducer: + kind = trace2.GenericSpanKindProducer + case trace.SpanKindConsumer: + kind = trace2.GenericSpanKindConsumer + } + + params := trace2.GenericSpanStartParams{ + EventParams: trace2.EventParams{ + TraceID: req.TraceID, + SpanID: req.SpanID, + }, + Name: spanName, + Time: time.Now(), + Kind: kind, + Attributes: attributesToLogFields(cfg.Attributes()), + StackDepth: -1, + } + + if ts := cfg.Timestamp(); !ts.IsZero() { + params.Time = ts + } + + if cfg.StackTrace() { + params.StackDepth = 1 + } + + traceLogger.GenericSpanStart(req, params, curr.Goctr) + } + + // Finally return the Open Telemetry span + var traceFlags trace.TraceFlags + if req.Traced { + traceFlags = trace.FlagsSampled + } + sc := trace.NewSpanContext(trace.SpanContextConfig{ + TraceID: trace.TraceID(req.TraceID), + SpanID: trace.SpanID(req.SpanID), + TraceFlags: traceFlags, + TraceState: trace.TraceState{}, + Remote: false, + }) + + span := &otelSpan{ + tracer: o, + name: spanName, + root: root, + sc: sc, + traceLogger: traceLogger, + resultCode: codes.Unset, + resultDescription: "", + } + + return trace.ContextWithSpan(ctx, span), span +} + +type otelSpanData struct { + SpanKind trace.SpanKind + Attributes []attribute.KeyValue +} + +type otelSpan struct { + noop.Span + tracer *otelTracer + + name string + root bool // is this span a root span? + sc trace.SpanContext + req *model.Request + + // The trace logger for this request. + // Note we track it within the otel span, so we can access it from any thread + // even if that thread is (according to Encore's tracing) not related to the span. + // + // This can happen in otel due to the fact Spans are simply user-defined and the user + // could in theory send one over a channel to another goroutine. + traceLogger trace2.Logger + + mu sync.Mutex + + // attributes recorded by the user using [SetAttributes] + attributes []attribute.KeyValue + lastError error + resultCode codes.Code + resultDescription string +} + +func (o *otelSpan) End(options ...trace.SpanEndOption) { + o.mu.Lock() + defer o.mu.Unlock() + + if !o.sc.TraceFlags().IsSampled() { + return + } + + rt := o.tracer.provider.reqTracker + + cfg := trace.NewSpanEndConfig(options...) + + // If we're tracing, record the span end + if o.traceLogger != nil { + attributes := append(o.attributes, cfg.Attributes()...) + + params := trace2.GenericSpanEndParams{ + EventParams: trace2.EventParams{ + TraceID: model.TraceID(o.sc.TraceID()), + SpanID: model.SpanID(o.sc.SpanID()), + }, + Time: time.Now(), + Error: o.lastError, + Attributes: attributesToLogFields(attributes), + StackDepth: -1, + } + + if ts := cfg.Timestamp(); !ts.IsZero() { + params.Time = ts + } + + if cfg.StackTrace() { + params.StackDepth = 1 + } + + o.traceLogger.GenericSpanEnd(o.req, params) + } + + rt.FinishRequest(false) +} + +func (o *otelSpan) AddEvent(name string, options ...trace.EventOption) { + if o.traceLogger == nil { + return + } + + cfg := trace.NewEventConfig(options...) + + params := trace2.GenericEventParams{ + EventParams: trace2.EventParams{ + TraceID: model.TraceID(o.sc.TraceID()), + SpanID: model.SpanID(o.sc.SpanID()), + }, + Name: name, + Time: time.Now(), + StackDepth: -1, + Attributes: attributesToLogFields(cfg.Attributes()), + } + + if ts := cfg.Timestamp(); !ts.IsZero() { + params.Time = ts + } + + if cfg.StackTrace() { + params.StackDepth = 1 + } + + o.traceLogger.GenericEvent(params) +} + +func (o *otelSpan) IsRecording() bool { + return o.sc.IsSampled() +} + +func (o *otelSpan) RecordError(err error, options ...trace.EventOption) { + o.mu.Lock() + o.lastError = err + o.mu.Unlock() + + if o.traceLogger == nil { + return + } + + o.resultCode = codes.Error + o.resultDescription = err.Error() + + cfg := trace.NewEventConfig(options...) + + params := trace2.GenericEventParams{ + EventParams: trace2.EventParams{ + TraceID: model.TraceID(o.sc.TraceID()), + SpanID: model.SpanID(o.sc.SpanID()), + }, + Name: "Error", + Error: err, + Time: time.Now(), + StackDepth: -1, + Attributes: attributesToLogFields(cfg.Attributes()), + } + + if ts := cfg.Timestamp(); !ts.IsZero() { + params.Time = ts + } + + if cfg.StackTrace() { + params.StackDepth = 1 + } + + o.traceLogger.GenericEvent(params) +} + +func (o *otelSpan) SpanContext() trace.SpanContext { + return o.sc +} + +func (o *otelSpan) SetStatus(code codes.Code, description string) { + o.mu.Lock() + defer o.mu.Unlock() + o.resultCode = code + o.resultDescription = description +} + +func (o *otelSpan) SetName(name string) { + o.mu.Lock() + defer o.mu.Unlock() + o.name = name +} + +func (o *otelSpan) SetAttributes(kv ...attribute.KeyValue) { + o.mu.Lock() + defer o.mu.Unlock() + o.attributes = append(o.attributes, kv...) +} + +func (o *otelSpan) TracerProvider() trace.TracerProvider { + return o.tracer.provider +} + +// attributesToLogFields converts OpenTelemetry attributes to Encore log fields. +// which we already can log. +func attributesToLogFields(attrs []attribute.KeyValue) []trace2.LogField { + fields := make([]trace2.LogField, 0, len(attrs)) + + for i, attr := range attrs { + var values []any + switch value := attr.Value.AsInterface().(type) { + case []bool: + values = make([]any, len(value)) + for i, v := range value { + values[i] = v + } + case []int64: + values = make([]any, len(value)) + for i, v := range value { + values[i] = v + } + case []float64: + values = make([]any, len(value)) + for i, v := range value { + values[i] = v + } + case []string: + values = make([]any, len(value)) + for i, v := range value { + values[i] = v + } + case bool, int64, float64, string: + values = []any{value} + default: + panic(fmt.Sprintf("unknown attribute value type %T", value)) + } + + for _, v := range values { + fields[i] = trace2.LogField{ + Key: string(attr.Key), + Value: v, + } + } + } + + return fields +} diff --git a/runtimes/go/appruntime/shared/reqtrack/otel_none.go b/runtimes/go/appruntime/shared/reqtrack/otel_none.go new file mode 100644 index 0000000000..46b0ab9a82 --- /dev/null +++ b/runtimes/go/appruntime/shared/reqtrack/otel_none.go @@ -0,0 +1,6 @@ +//go:build !opentelemetry + +package reqtrack + +// configureOpenTelemetry is a no-op when OpenTelemetry is not enabled. +func configureOpenTelemetry(*RequestTracker) {} diff --git a/runtimes/go/appruntime/shared/reqtrack/reqtrack.go b/runtimes/go/appruntime/shared/reqtrack/reqtrack.go index 51dd51b71d..7f979d4865 100644 --- a/runtimes/go/appruntime/shared/reqtrack/reqtrack.go +++ b/runtimes/go/appruntime/shared/reqtrack/reqtrack.go @@ -8,6 +8,8 @@ import ( "encore.dev/appruntime/shared/traceprovider" ) +var Singleton *RequestTracker + // New creates a new RequestTracker. // // If traceProvider is nil no traces are generated. @@ -40,12 +42,21 @@ func (t *RequestTracker) FinishOperation() { t.finishOp() } -func (t *RequestTracker) BeginRequest(req *model.Request) { +// BeginRequest starts a new request for this Goroutine. +// +// If pushStack is true the current stack is pushed onto the operations stack +// meaning that when the request if finished the stack will be popped off the +// operations stack and restored. +func (t *RequestTracker) BeginRequest(req *model.Request, pushStack bool) { + var old *encoreReq if prev, _, _, _ := t.currentReq(); prev != nil { copyReqInfoFromParent(req, prev) - t.clearReq() + old = t.clearReq() + } + if !pushStack { + old = nil } - t.beginReq(req, req.Traced) + t.beginReq(req, req.Traced, old) } // copyReqInfoFromParent copies over relevant request from the parent request. diff --git a/runtimes/go/appruntime/shared/reqtrack/singleton.go b/runtimes/go/appruntime/shared/reqtrack/singleton.go index 0bbd8589ce..e2215da025 100644 --- a/runtimes/go/appruntime/shared/reqtrack/singleton.go +++ b/runtimes/go/appruntime/shared/reqtrack/singleton.go @@ -9,8 +9,6 @@ import ( "encore.dev/appruntime/shared/traceprovider" ) -var Singleton *RequestTracker - func init() { var traceFactory traceprovider.Factory tracingEnabled := appconf.Runtime.TraceEndpoint != "" && len(appconf.Runtime.AuthKeys) > 0 @@ -19,4 +17,6 @@ func init() { } Singleton = New(logging.RootLogger, platform.Singleton, traceFactory) + + configureOpenTelemetry(Singleton) } diff --git a/runtimes/go/appruntime/shared/testsupport/testsupport.go b/runtimes/go/appruntime/shared/testsupport/testsupport.go index 85ec3be2de..688377929d 100644 --- a/runtimes/go/appruntime/shared/testsupport/testsupport.go +++ b/runtimes/go/appruntime/shared/testsupport/testsupport.go @@ -106,7 +106,7 @@ func (mgr *Manager) StartTest(t *testing.T, fn func(*testing.T)) { Logger: &logger, SvcNum: svcNum, } - mgr.rt.BeginRequest(req) + mgr.rt.BeginRequest(req, false) if curr := mgr.rt.Current(); curr.Trace != nil { curr.Trace.TestSpanStart(req, curr.Goctr) } diff --git a/runtimes/go/appruntime/shared/traceprovider/mock_trace/mock_trace.go b/runtimes/go/appruntime/shared/traceprovider/mock_trace/mock_trace.go index ed610453cc..3fd043d97a 100644 --- a/runtimes/go/appruntime/shared/traceprovider/mock_trace/mock_trace.go +++ b/runtimes/go/appruntime/shared/traceprovider/mock_trace/mock_trace.go @@ -167,6 +167,42 @@ func (mr *MockLoggerMockRecorder) DBTransactionStart(arg0, arg1 interface{}) *go return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DBTransactionStart", reflect.TypeOf((*MockLogger)(nil).DBTransactionStart), arg0, arg1) } +// GenericEvent mocks base method. +func (m *MockLogger) GenericEvent(params trace2.GenericEventParams) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "GenericEvent", params) +} + +// GenericEvent indicates an expected call of GenericEvent. +func (mr *MockLoggerMockRecorder) GenericEvent(params interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenericEvent", reflect.TypeOf((*MockLogger)(nil).GenericEvent), params) +} + +// GenericSpanEnd mocks base method. +func (m *MockLogger) GenericSpanEnd(req *model.Request, params trace2.GenericSpanEndParams) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "GenericSpanEnd", req, params) +} + +// GenericSpanEnd indicates an expected call of GenericSpanEnd. +func (mr *MockLoggerMockRecorder) GenericSpanEnd(req, params interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenericSpanEnd", reflect.TypeOf((*MockLogger)(nil).GenericSpanEnd), req, params) +} + +// GenericSpanStart mocks base method. +func (m *MockLogger) GenericSpanStart(req *model.Request, params trace2.GenericSpanStartParams, goid uint32) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "GenericSpanStart", req, params, goid) +} + +// GenericSpanStart indicates an expected call of GenericSpanStart. +func (mr *MockLoggerMockRecorder) GenericSpanStart(req, params, goid interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenericSpanStart", reflect.TypeOf((*MockLogger)(nil).GenericSpanStart), req, params, goid) +} + // GetAndClear mocks base method. func (m *MockLogger) GetAndClear() ([]byte, bool) { m.ctrl.T.Helper() diff --git a/runtimes/go/go.mod b/runtimes/go/go.mod index 2bcad4ba0c..96bb3cff37 100644 --- a/runtimes/go/go.mod +++ b/runtimes/go/go.mod @@ -23,7 +23,7 @@ require ( github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 github.com/golang/snappy v0.0.4 - github.com/google/go-cmp v0.5.9 + github.com/google/go-cmp v0.6.0 github.com/jackc/pgx/v5 v5.3.1 github.com/json-iterator/go v1.1.12 github.com/julienschmidt/httprouter v1.3.0 @@ -61,6 +61,8 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/golang-jwt/jwt/v4 v4.4.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/s2a-go v0.1.4 // indirect @@ -82,6 +84,9 @@ require ( github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 // indirect go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/otel v1.22.0 // indirect + go.opentelemetry.io/otel/metric v1.22.0 // indirect + go.opentelemetry.io/otel/trace v1.22.0 // indirect golang.org/x/net v0.13.0 // indirect golang.org/x/oauth2 v0.10.0 // indirect golang.org/x/sync v0.3.0 // indirect diff --git a/runtimes/go/go.sum b/runtimes/go/go.sum index 6ff525dc66..bb6ea1dc4d 100644 --- a/runtimes/go/go.sum +++ b/runtimes/go/go.sum @@ -112,6 +112,13 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +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/go-logr/zerologr v1.2.3 h1:up5N9vcH9Xck3jJkXzgyOxozT14R47IyDODz8LM1KSs= +github.com/go-logr/zerologr v1.2.3/go.mod h1:BxwGo7y5zgSHYR1BjbnHPyF/5ZjVKfKxAZANVu6E8Ho= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= @@ -161,6 +168,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= @@ -263,6 +272,12 @@ go.encore.dev/platform-sdk v1.1.0 h1:0BYLt7ZAoPje3KMLee6/gA2FECHwzi1sKgp3SqC+QRo go.encore.dev/platform-sdk v1.1.0/go.mod h1:ImcJU8p0V3bSXb+d++Ni/8hFDwVZaFpUAAySTY2x6FY= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y= +go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= +go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg= +go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= +go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0= +go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= diff --git a/runtimes/go/metrics/metrics_test.go b/runtimes/go/metrics/metrics_test.go index 4aa93716b9..fa300f6288 100644 --- a/runtimes/go/metrics/metrics_test.go +++ b/runtimes/go/metrics/metrics_test.go @@ -67,7 +67,7 @@ func TestCounter_MultipleServices(t *testing.T) { // Inside a request they should work. { - rt.BeginRequest(&model.Request{SvcNum: 1}) + rt.BeginRequest(&model.Request{SvcNum: 1}, false) c.Increment() c.Add(2) eq(t, ts.value[0], 3) @@ -83,7 +83,7 @@ func TestCounter_MultipleServices(t *testing.T) { // Inside a request they should work. { - rt.BeginRequest(&model.Request{SvcNum: 2}) + rt.BeginRequest(&model.Request{SvcNum: 2}, false) c.Increment() eq(t, ts.value[0], 3) eq(t, ts.value[1], 1) diff --git a/runtimes/go/pubsub/subscription.go b/runtimes/go/pubsub/subscription.go index b2f4bcdc8e..37be04241e 100644 --- a/runtimes/go/pubsub/subscription.go +++ b/runtimes/go/pubsub/subscription.go @@ -204,7 +204,7 @@ func NewSubscription[T any](topic *Topic[T], name string, cfg SubscriptionConfig } } - mgr.rt.BeginRequest(req) + mgr.rt.BeginRequest(req, false) curr := mgr.rt.Current() if curr.Trace != nil { curr.Trace.PubsubMessageSpanStart(req, curr.Goctr) diff --git a/runtimes/go/tracing/pkgfn_internal.go b/runtimes/go/tracing/pkgfn_internal.go new file mode 100644 index 0000000000..8c12fe9270 --- /dev/null +++ b/runtimes/go/tracing/pkgfn_internal.go @@ -0,0 +1,113 @@ +package tracing + +import ( + "runtime" + "time" + + "encore.dev/appruntime/exported/model" + "encore.dev/appruntime/exported/trace2" + "encore.dev/appruntime/shared/reqtrack" +) + +// StartSpan starts a new span with the given name, once started you must call Finish on the returned span to complete +// the span. +// +// For Example: +// +// func myFunc() { +// span := tracing.StartSpan("my-func") +// defer span.Finish(nil) +// // do stuff +// } +// +// You can add attributes to the span by calling WithAttributes on the returned span, for example: +// +// func myFunc(userID int) { +// span := tracing.StartSpan("my-func").WithAttributes("user-id", userID) +// defer span.Finish(nil) +// // do stuff +// } +// +// ## Span Types +// +// By default the span is created as an internal span, indicating that it is not part of the user's request, but something +// that your app is doing internally to handle the request and you want to track it separately to any other span that +// Encore creates automatically. However if you want to change the span type you can do so by passing a cfg here. +// +// The supported span types are: +// - [AsRequestHandler] - Indicates this span is around code handling a request from an external system. +// - [AsCall] - Indicates this span is wrapped around code making a call to an external system. +// - [AsProducer] - Indicates this span is creating a message which will be handled asynchronously by another system. +// - [AsConsumer] - Indicates this span is handling a message which was created by a producer previously. +func StartSpan(name string, cfg ...SpanConfig) Span { + rt := reqtrack.Singleton + if rt == nil { + // If we're not running inside an encore app the req tracking singleton will not be initialized + return &userSpan{} + } + + traceID, err := model.GenTraceID() + if err != nil { + rt.Logger().Err(err).Msg("failed to create TraceID for span; no span will be created") + return &userSpan{} + } + spanID, err := model.GenSpanID() + if err != nil { + rt.Logger().Err(err).Msg("failed to create SpanID for span; no span will be created") + return &userSpan{} + } + + curr := rt.Current() + isRoot := curr.Req == nil + + if isRoot { + rt.BeginOperation() + } + + // Begin the request + req := &model.Request{ + Type: model.Unknown, + TraceID: traceID, + SpanID: spanID, + Start: time.Now(), + Traced: rt.TracingEnabled(), + } + rt.BeginRequest(req, true) + + sc := &spanConfig{ + spanType: trace2.GenericSpanKindInternal, + attributes: nil, + } + for _, opt := range cfg { + opt(sc) + } + + // Start the span if we're tracing + curr = rt.Current() + tracer := curr.Trace + if tracer != nil { + tracer.GenericSpanStart(req, trace2.GenericSpanStartParams{ + EventParams: trace2.EventParams{ + TraceID: req.TraceID, + SpanID: req.SpanID, + }, + Name: name, + Kind: sc.spanType, + Time: time.Now(), + Attributes: sc.attributes, + StackDepth: 1, + }, curr.Goctr) + } + + span := &userSpan{ + req: req, + tracer: tracer, + isRoot: isRoot, + } + + // If the user never calls Finish on the span we need to make sure we finish it when the span is garbage collected + // otherwise we'll leave dangling requests in memory as we never call FinishRequest on the request tracker. + runtime.SetFinalizer(span, userSpanFinalizer) + + return span +} diff --git a/runtimes/go/tracing/span_internal.go b/runtimes/go/tracing/span_internal.go new file mode 100644 index 0000000000..d17eafbad6 --- /dev/null +++ b/runtimes/go/tracing/span_internal.go @@ -0,0 +1,136 @@ +package tracing + +import ( + "errors" + "sync/atomic" + "time" + + "encore.dev/appruntime/exported/model" + "encore.dev/appruntime/exported/trace2" + "encore.dev/appruntime/shared/reqtrack" +) + +// Span represents a span that can be finished. +type Span interface { + // WithAttributes adds the given key/value pairs as attributes to the span, when the span is finished these attributes + // will be added to the span result. + // + // The keysAndValues must be pairs of string keys and arbitrary data + // + // The returned span is still the same span, it is returned for chaining purposes. + WithAttributes(keysAndValues ...any) Span + + // Finish completes the span, and reports the error if provided, if nil the span is reported as successful. + // + // If you call it more than once it will panic. + Finish(err error) +} + +type userSpan struct { + req *model.Request + tracer trace2.Logger + attributes []trace2.LogField + isRoot bool + finished atomic.Bool +} + +func userSpanFinalizer(s *userSpan) { + if !s.finished.Load() { + s.Finish(errors.New("span not finished before being garbage collected")) + } +} + +func (u *userSpan) WithAttributes(keysAndValues ...any) Span { + for i := 0; i < len(keysAndValues); i += 2 { + u.attributes = append(u.attributes, trace2.LogField{ + Key: keysAndValues[i].(string), + Value: keysAndValues[i+1], + }) + } + + return u +} + +func (u *userSpan) Finish(err error) { + if !u.finished.CompareAndSwap(false, true) { + panic("span already finished") + } + + rt := reqtrack.Singleton + if u.req == nil || rt == nil { + return + } + + // End the span if we're tracing + curr := rt.Current() + if u.tracer != nil { + u.tracer.GenericSpanEnd(u.req, trace2.GenericSpanEndParams{ + EventParams: trace2.EventParams{ + TraceID: u.req.TraceID, + SpanID: u.req.SpanID, + Goid: curr.Goctr, + }, + Time: time.Now(), + Error: err, + Attributes: u.attributes, + StackDepth: 1, + }) + } + + // End the request + rt.FinishRequest(false) + + if u.isRoot { + rt.FinishOperation() + } +} + +type spanConfig struct { + spanType trace2.GenericSpanKind + attributes []trace2.LogField +} +type SpanConfig func(*spanConfig) + +// WithAttributes is a SpanConfig that adds the given key/value pairs as attributes to the span. +func WithAttributes(keysAndValues ...any) SpanConfig { + return func(c *spanConfig) { + for i := 0; i < len(keysAndValues); i += 2 { + c.attributes = append(c.attributes, trace2.LogField{ + Key: keysAndValues[i].(string), + Value: keysAndValues[i+1], + }) + } + } +} + +// AsRequestHandler is a SpanConfig that sets the span type to be a request handler, +// this is useful for spans that are created as a direct response to an external request. +func AsRequestHandler() SpanConfig { + return func(c *spanConfig) { + c.spanType = trace2.GenericSpanKindRequest + } +} + +// AsCall is a SpanConfig that sets the span type to be a call, indicating the code within +// the span is making a call to another service or system. +func AsCall() SpanConfig { + return func(c *spanConfig) { + c.spanType = trace2.GenericSpanKindCall + } +} + +// AsProducer is a SpanConfig that sets the span type to be a producer, indicating the code within +// the span is producing a message to be consumed by another service or system at a later time. +func AsProducer() SpanConfig { + return func(c *spanConfig) { + c.spanType = trace2.GenericSpanKindProducer + } +} + +// AsConsumer is a SpanConfig that sets the span type to be a consumer, indicating the code within +// the span is consuming a message produced by another service or system. +func AsConsumer() SpanConfig { + return func(c *spanConfig) { + c.spanType = trace2.GenericSpanKindConsumer + } +} diff --git a/v2/codegen/apigen/apigen.go b/v2/codegen/apigen/apigen.go index 44a41e2f3a..d45804e446 100644 --- a/v2/codegen/apigen/apigen.go +++ b/v2/codegen/apigen/apigen.go @@ -13,6 +13,7 @@ import ( "encr.dev/v2/codegen/apigen/maingen" "encr.dev/v2/codegen/apigen/middlewaregen" "encr.dev/v2/codegen/apigen/servicestructgen" + "encr.dev/v2/codegen/apigen/tracegen" "encr.dev/v2/codegen/apigen/userfacinggen" "encr.dev/v2/internals/pkginfo" "encr.dev/v2/parser/apis/api" @@ -95,5 +96,7 @@ func Process(p Params) *config.Static { maps.Copy(gp.Middleware, mws) } + tracegen.Gen(p.Gen, p.Desc) + return maingen.Gen(gp) } diff --git a/v2/codegen/apigen/tracegen/testdata/all_types.txt b/v2/codegen/apigen/tracegen/testdata/all_types.txt new file mode 100644 index 0000000000..f01582425d --- /dev/null +++ b/v2/codegen/apigen/tracegen/testdata/all_types.txt @@ -0,0 +1,86 @@ +-- svca/svca.go -- +package svca + +import "context" + +//encore:api public +func Foo(ctx context.Context) error { return nil } + +//encore:trace type=internal +func SomeInternal(ctx context.Context) error { return nil } + +//encore:trace type=request_handler +func SomeRequestHandler(ctx context.Context) error { return nil } + +//encore:trace type=call +func SomeCall(ctx context.Context) error { return nil } + +//encore:trace type=producer +func SomeProducer(ctx context.Context) error { return nil } + +//encore:trace type=consumer +func SomeConsumer(ctx context.Context) error { return nil } + +-- want:svca/svca.go -- +package svca + + +import __encore_tracing_api "encore.dev/tracing";/*line :3:1*/import "context" + +//encore:api public +func Foo(ctx context.Context) error { return nil } + +//encore:trace type=internal +func SomeInternal(ctx context.Context) (__encore_named_rtn_var_0 error) { + __auto_generated_span := __encore_tracing_api.StartSpan( + "svca.SomeInternal", + ); + defer func() { + __auto_generated_span. + Finish(__encore_named_rtn_var_0) + }();/*line :9:47*/ return nil } + +//encore:trace type=request_handler +func SomeRequestHandler(ctx context.Context) (__encore_named_rtn_var_0 error) { + __auto_generated_span := __encore_tracing_api.StartSpan( + "svca.SomeRequestHandler", + __encore_tracing_api.AsRequestHandler(), + ); + defer func() { + __auto_generated_span. + Finish(__encore_named_rtn_var_0) + }();/*line :12:53*/ return nil } + +//encore:trace type=call +func SomeCall(ctx context.Context) (__encore_named_rtn_var_0 error) { + __auto_generated_span := __encore_tracing_api.StartSpan( + "svca.SomeCall", + __encore_tracing_api.AsCall(), + ); + defer func() { + __auto_generated_span. + Finish(__encore_named_rtn_var_0) + }();/*line :15:43*/ return nil } + +//encore:trace type=producer +func SomeProducer(ctx context.Context) (__encore_named_rtn_var_0 error) { + __auto_generated_span := __encore_tracing_api.StartSpan( + "svca.SomeProducer", + __encore_tracing_api.AsProducer(), + ); + defer func() { + __auto_generated_span. + Finish(__encore_named_rtn_var_0) + }();/*line :18:47*/ return nil } + +//encore:trace type=consumer +func SomeConsumer(ctx context.Context) (__encore_named_rtn_var_0 error) { + __auto_generated_span := __encore_tracing_api.StartSpan( + "svca.SomeConsumer", + __encore_tracing_api.AsConsumer(), + ); + defer func() { + __auto_generated_span. + Finish(__encore_named_rtn_var_0) + }();/*line :21:47*/ return nil } + diff --git a/v2/codegen/apigen/tracegen/testdata/already_imported.txt b/v2/codegen/apigen/tracegen/testdata/already_imported.txt new file mode 100644 index 0000000000..c33eea4750 --- /dev/null +++ b/v2/codegen/apigen/tracegen/testdata/already_imported.txt @@ -0,0 +1,71 @@ +-- svca/svca.go -- +package svca + +import ( + "context" + "encore.dev/tracing" + "example.com/lib" +) + +//encore:api public +func Foo(ctx context.Context) error { return nil } + +//encore:trace +func Bar(ctx context.Context) error { + return lib.Baz(ctx, "foo") +} +-- lib/lib.go -- +package lib + +import ( + "context" + alreadyNamed "encore.dev/tracing" +) + +//encore:trace +func Baz(ctx context.Context, name string) (err error) { + return nil +} +-- want:lib/lib.go -- +package lib + +import ( + "context" + alreadyNamed "encore.dev/tracing" +) + +//encore:trace +func Baz(ctx context.Context, name string) (err error) { + __auto_generated_span := alreadyNamed.StartSpan( + "lib.Baz", + alreadyNamed.WithAttributes("name", name), + ); + defer func() { + __auto_generated_span. + Finish(err) + }();/*line :9:57*/ + return nil +} +-- want:svca/svca.go -- +package svca + +import ( + "context" + "encore.dev/tracing" + "example.com/lib" +) + +//encore:api public +func Foo(ctx context.Context) error { return nil } + +//encore:trace +func Bar(ctx context.Context) (__encore_named_rtn_var_0 error) { + __auto_generated_span := tracing.StartSpan( + "svca.Bar", + ); + defer func() { + __auto_generated_span. + Finish(__encore_named_rtn_var_0) + }();/*line :13:38*/ + return lib.Baz(ctx, "foo") +} diff --git a/v2/codegen/apigen/tracegen/testdata/basic.txt b/v2/codegen/apigen/tracegen/testdata/basic.txt new file mode 100644 index 0000000000..7ec643646f --- /dev/null +++ b/v2/codegen/apigen/tracegen/testdata/basic.txt @@ -0,0 +1,32 @@ +-- svca/svca.go -- +package svca + +import "context" + +//encore:api public +func Foo(ctx context.Context) error { return nil } + +//encore:trace +func Bar(ctx context.Context) error { + return Foo(ctx) +} +-- want:svca/svca.go -- +package svca + + +import __encore_tracing_api "encore.dev/tracing";/*line :3:1*/import "context" + +//encore:api public +func Foo(ctx context.Context) error { return nil } + +//encore:trace +func Bar(ctx context.Context) (__encore_named_rtn_var_0 error) { + __auto_generated_span := __encore_tracing_api.StartSpan( + "svca.Bar", + ); + defer func() { + __auto_generated_span. + Finish(__encore_named_rtn_var_0) + }();/*line :9:38*/ + return Foo(ctx) +} diff --git a/v2/codegen/apigen/tracegen/testdata/no_params_or_return.txt b/v2/codegen/apigen/tracegen/testdata/no_params_or_return.txt new file mode 100644 index 0000000000..e626b09273 --- /dev/null +++ b/v2/codegen/apigen/tracegen/testdata/no_params_or_return.txt @@ -0,0 +1,32 @@ +-- svca/svca.go -- +package svca + +import "context" + +//encore:api public +func Foo(ctx context.Context) error { return nil } + +//encore:trace +func Bar() { + _ = Foo(context.Background()) +} +-- want:svca/svca.go -- +package svca + + +import __encore_tracing_api "encore.dev/tracing";/*line :3:1*/import "context" + +//encore:api public +func Foo(ctx context.Context) error { return nil } + +//encore:trace +func Bar() { + __auto_generated_span := __encore_tracing_api.StartSpan( + "svca.Bar", + ); + defer func() { + __auto_generated_span. + Finish(nil) + }();/*line :9:13*/ + _ = Foo(context.Background()) +} diff --git a/v2/codegen/apigen/tracegen/testdata/request_and_response_params.txt b/v2/codegen/apigen/tracegen/testdata/request_and_response_params.txt new file mode 100644 index 0000000000..04e4a5179b --- /dev/null +++ b/v2/codegen/apigen/tracegen/testdata/request_and_response_params.txt @@ -0,0 +1,70 @@ +-- svca/svca.go -- +package svca + +import ( + "context" + "example.com/lib" +) + +//encore:api public +func Foo(ctx context.Context) error { return nil } + +//encore:trace +func Bar(ctx context.Context, name string, p *lib.ExtraParams) (int, error) { + return 12, Foo(ctx) +} + +//encore:trace name=my_baz type=call +func Baz(ctx context.Context, p *lib.ExtraParams) (age *lib.ExtraParams, err error) { + return nil, Foo(ctx) +} + +-- lib/lib.go -- +package lib + +type ExtraParams struct { + Name string + Age int +} + +-- want:svca/svca.go -- +package svca + + +import __encore_tracing_api "encore.dev/tracing";/*line :3:1*/import ( + "context" + "example.com/lib" +) + +//encore:api public +func Foo(ctx context.Context) error { return nil } + +//encore:trace +func Bar(ctx context.Context, name string, p *lib.ExtraParams) (__encore_named_rtn_var_0 int, __encore_named_rtn_var_1 error) { + __auto_generated_span := __encore_tracing_api.StartSpan( + "svca.Bar", + __encore_tracing_api.WithAttributes("name", name, "p", p), + ); + defer func() { + __auto_generated_span. + WithAttributes("return 1", __encore_named_rtn_var_0). + Finish(__encore_named_rtn_var_1) + }();/*line :12:78*/ + return 12, Foo(ctx) +} + +//encore:trace name=my_baz type=call +func Baz(ctx context.Context, p *lib.ExtraParams) (age *lib.ExtraParams, err error) { + __auto_generated_span := __encore_tracing_api.StartSpan( + "my_baz", + __encore_tracing_api.AsCall(), + __encore_tracing_api.WithAttributes("p", p), + ); + defer func() { + __auto_generated_span. + WithAttributes("age", age). + Finish(err) + }();/*line :17:86*/ + return nil, Foo(ctx) +} + diff --git a/v2/codegen/apigen/tracegen/testdata/variadic.txt b/v2/codegen/apigen/tracegen/testdata/variadic.txt new file mode 100644 index 0000000000..35718cd5e5 --- /dev/null +++ b/v2/codegen/apigen/tracegen/testdata/variadic.txt @@ -0,0 +1,41 @@ +-- svca/svca.go -- +package svca + +import "context" + +//encore:api public +func Foo(ctx context.Context) error { return nil } + +//encore:trace +func Bar(target int, toCheck ...int) { + for _, v := range toCheck { + if v == target { + _ = Foo(context.Background()) + } + } +} +-- want:svca/svca.go -- +package svca + + +import __encore_tracing_api "encore.dev/tracing";/*line :3:1*/import "context" + +//encore:api public +func Foo(ctx context.Context) error { return nil } + +//encore:trace +func Bar(target int, toCheck ...int) { + __auto_generated_span := __encore_tracing_api.StartSpan( + "svca.Bar", + __encore_tracing_api.WithAttributes("target", target, "toCheck", toCheck), + ); + defer func() { + __auto_generated_span. + Finish(nil) + }();/*line :9:39*/ + for _, v := range toCheck { + if v == target { + _ = Foo(context.Background()) + } + } +} diff --git a/v2/codegen/apigen/tracegen/testdata/with_name.txt b/v2/codegen/apigen/tracegen/testdata/with_name.txt new file mode 100644 index 0000000000..9ddb8a55bb --- /dev/null +++ b/v2/codegen/apigen/tracegen/testdata/with_name.txt @@ -0,0 +1,32 @@ +-- svca/svca.go -- +package svca + +import "context" + +//encore:api public +func Foo(ctx context.Context) error { return nil } + +//encore:trace name="some complex background function" +func Bar(ctx context.Context) error { + return Foo(ctx) +} +-- want:svca/svca.go -- +package svca + + +import __encore_tracing_api "encore.dev/tracing";/*line :3:1*/import "context" + +//encore:api public +func Foo(ctx context.Context) error { return nil } + +//encore:trace name="some complex background function" +func Bar(ctx context.Context) (__encore_named_rtn_var_0 error) { + __auto_generated_span := __encore_tracing_api.StartSpan( + "some complex background function", + ); + defer func() { + __auto_generated_span. + Finish(__encore_named_rtn_var_0) + }();/*line :9:38*/ + return Foo(ctx) +} diff --git a/v2/codegen/apigen/tracegen/tracegen.go b/v2/codegen/apigen/tracegen/tracegen.go new file mode 100644 index 0000000000..92854e7f11 --- /dev/null +++ b/v2/codegen/apigen/tracegen/tracegen.go @@ -0,0 +1,227 @@ +package tracegen + +import ( + "fmt" + "go/ast" + "go/token" + "strconv" + "strings" + + "encr.dev/v2/app" + "encr.dev/v2/codegen" + "encr.dev/v2/codegen/internal/rewrite" + "encr.dev/v2/internals/pkginfo" + "encr.dev/v2/parser/apis/tracedfunc" + "encr.dev/v2/parser/resource" +) + +func Gen(gen *codegen.Generator, appDesc *app.Desc) { + for _, fn := range collectTracedFunctions(appDesc) { + rewriteTracedFunc(gen, fn) + } +} + +func rewriteTracedFunc(gen *codegen.Generator, tf *tracedfunc.TracedFunc) { + rw := gen.Rewrite(tf.File) + + importName := getOrAddTracingImport(gen, rw, tf.File) + + insertPos := tf.AST.Body.Pos() + 1 + ln := gen.FS.Position(insertPos) + + withTypeAttribute := "" + switch tf.Type { + case tracedfunc.Internal: + // no-op this is default + case tracedfunc.RequestHandler: + withTypeAttribute = "AsRequestHandler" + case tracedfunc.Call: + withTypeAttribute = "AsCall" + case tracedfunc.Producer: + withTypeAttribute = "AsProducer" + case tracedfunc.Consumer: + withTypeAttribute = "AsConsumer" + default: + gen.Errs.Fatal(tf.Pos(), fmt.Sprintf("unknown trace type %q", tf.Type)) + } + if withTypeAttribute != "" { + withTypeAttribute = fmt.Sprintf("\n\t\t%s.%s(),", importName, withTypeAttribute) + } + + // Create if required the "tracing.WithAttributes" for the initial "StartSpan" call + params := paramData(tf.AST) + withAttributesOnCall := "" + if len(params) > 0 { + withAttributesOnCall = fmt.Sprintf("\n\t\t%s.WithAttributes(%s),", importName, strings.Join(params, ", ")) + } + + // Create if required the "span.WithAttributes" for the final "Finish" call + // and capture the name of the last error return variable + errorVariableName, returnVars := returnData(rw, tf.AST) + withAttributesOnReturn := "" + if len(returnVars) > 0 { + withAttributesOnReturn = fmt.Sprintf(".\n\t\t\tWithAttributes(%s)", strings.Join(returnVars, ", ")) + } + + // Insert the tracing code + rw.Insert(insertPos, []byte(fmt.Sprintf( + "\n\t__auto_generated_span := %s.StartSpan(\n\t\t%q,%s%s\n\t);"+ + "\n\tdefer func() {\n\t\t__auto_generated_span%s.\n\t\t\tFinish(%s)\n\t}();/*line :%d:%d*/", + importName, tf.Name, withTypeAttribute, withAttributesOnCall, + withAttributesOnReturn, errorVariableName, + ln.Line, ln.Column, + ))) +} + +// paramData returns a list of all the parameters to the function as the idents +// with one quoted and one not quoted. +func paramData(fn *ast.FuncDecl) []string { + var params []string + for _, param := range fn.Type.Params.List { + if ignoreVariableBasedOnType(param.Type) { + continue + } + + for _, name := range param.Names { + params = append(params, strconv.Quote(name.Name), name.Name) + } + } + return params + +} + +// returnData returns the name of the last error return variable and a list of all the other return variables. +// with a name to display as the variable name, followed by the actual variable name. +// +// If returned it will rewrite the function to have named return variables. +// +// i.e. +// +// func foo() (string, error) ==> func foo() (__encore_named_rtn_var_0 string, __encore_named_rtn_var_1 error) +// func foo() error => func foo() (__encore_named_rtn_var_0 error) +func returnData(rw *rewrite.Rewriter, fn *ast.FuncDecl) (string, []string) { + if fn.Type.Results == nil || len(fn.Type.Results.List) == 0 { + // There are no return variables + return "nil", nil + } + rtnVars := fn.Type.Results.List + + if fn.Type.Results.Opening == token.NoPos { + // we need to add () around the return list + rw.Insert(fn.Type.Results.Pos(), []byte("(")) + rw.Insert(fn.Type.Results.End(), []byte(")")) + } + + lastErrorType := "nil" + var attributesToCapture []string + lastErrorIdx := -1 + for i, res := range rtnVars { + ident := "" + displayName := "" + if len(res.Names) == 0 { + // If the variable is unnamed, we need to name it so we can capture it + ident = fmt.Sprintf("__encore_named_rtn_var_%d", i) + displayName = fmt.Sprintf("return %d", i+1) + + rw.Insert(res.Type.Pos(), []byte(ident+" ")) + res.Names = []*ast.Ident{ast.NewIdent(ident)} + } else { + // Otherwise we can use the name of the variable + ident = res.Names[0].Name + displayName = ident + } + + if ignoreVariableBasedOnType(res.Type) { + continue + } + + switch t := res.Type.(type) { + case *ast.Ident: + if t.Name == "error" { + lastErrorType = ident + lastErrorIdx = i + } + } + + attributesToCapture = append(attributesToCapture, strconv.Quote(displayName), ident) + } + + // Now remove the last error return variable from the attributes to capture + if lastErrorIdx != -1 { + attributesToCapture = append(attributesToCapture[:lastErrorIdx*2], attributesToCapture[lastErrorIdx*2+2:]...) + } + + // no error return variable + return lastErrorType, attributesToCapture +} + +func ignoreVariableBasedOnType(t ast.Expr) bool { + // Skip over context.Context parameters + switch param := t.(type) { + case *ast.SelectorExpr: + if ident, ok := param.X.(*ast.Ident); ok && ident.Name == "context" { + // ignore everything from the context package + return true + } + } + + return false +} + +func getOrAddTracingImport(gen *codegen.Generator, rw *rewrite.Rewriter, file *pkginfo.File) string { + tracingImport, found := file.Imports["encore.dev/tracing"] + + // If the import is not found, add it. + if !found { + name := "__encore_tracing_api" + tracingImport = &ast.ImportSpec{Name: ast.NewIdent(name)} + file.Imports["encore.dev/tracing"] = tracingImport + insertTracingImport(gen, rw, file.AST(), name) + return name + } + + importSpec := tracingImport.(*ast.ImportSpec) + if importSpec.Name == nil { + return "tracing" + } + + return importSpec.Name.Name +} + +func insertTracingImport(gen *codegen.Generator, rw *rewrite.Rewriter, file *ast.File, import_name string) { + insertPos := firstASTNode(file) + ln := gen.FS.Position(insertPos) + + rw.Insert( + insertPos, + []byte(fmt.Sprintf("\nimport %s %s;/*line :%d:%d*/", + import_name, + strconv.Quote("encore.dev/tracing"), + ln.Line, ln.Column, + )), + ) +} + +func firstASTNode(file *ast.File) token.Pos { + if len(file.Decls) > 0 { + return file.Decls[0].Pos() + } + + if len(file.Comments) > 0 { + return file.Comments[0].Pos() + } + + return token.NoPos +} + +// collectTracedFunctions collects all traced functions in the app. +func collectTracedFunctions(appDesc *app.Desc) (tfs []*tracedfunc.TracedFunc) { + for _, res := range appDesc.Parse.Resources() { + if res.Kind() == resource.TracedFunc { + tf := res.(*tracedfunc.TracedFunc) + tfs = append(tfs, tf) + } + } + + return tfs +} diff --git a/v2/codegen/apigen/tracegen/tracegen_test.go b/v2/codegen/apigen/tracegen/tracegen_test.go new file mode 100644 index 0000000000..814429b431 --- /dev/null +++ b/v2/codegen/apigen/tracegen/tracegen_test.go @@ -0,0 +1,16 @@ +package tracegen + +import ( + "testing" + + "encr.dev/v2/app" + "encr.dev/v2/codegen" + "encr.dev/v2/codegen/internal/codegentest" +) + +func TestCodegen(t *testing.T) { + fn := func(gen *codegen.Generator, desc *app.Desc) { + Gen(gen, desc) + } + codegentest.Run(t, fn) +} diff --git a/v2/codegen/internal/codegentest/codegentest.go b/v2/codegen/internal/codegentest/codegentest.go index 2f431603c7..bdbd921b9f 100644 --- a/v2/codegen/internal/codegentest/codegentest.go +++ b/v2/codegen/internal/codegentest/codegentest.go @@ -37,6 +37,12 @@ func Run(t *testing.T, fn func(*codegen.Generator, *app.Desc)) { flag.Parse() c := qt.New(t) tests := readTestCases(c, "testdata") + + goRuntime := filepath.Join(os.Getenv("ENCORE_RUNTIMES_PATH"), "go") + if _, err := os.Stat(goRuntime); err != nil { + c.Fatal(err) + } + for _, test := range tests { c.Run(test.name, func(c *qt.C) { tc := testutil.NewContext(c, false, test.input) @@ -48,7 +54,7 @@ func Run(t *testing.T, fn func(*codegen.Generator, *app.Desc)) { if !errors.Is(err, fs.ErrNotExist) { c.Fatal(err) } - modContents := "module example.com\nrequire encore.dev v1.13.4" + modContents := "module example.com\nrequire encore.dev v1.30.0\nreplace encore.dev => " + goRuntime err := os.WriteFile(modPath, []byte(modContents), 0644) c.Assert(err, qt.IsNil) } diff --git a/v2/parser/apis/internal/directive/directive.go b/v2/parser/apis/internal/directive/directive.go index 7c4229203a..ac069db40b 100644 --- a/v2/parser/apis/internal/directive/directive.go +++ b/v2/parser/apis/internal/directive/directive.go @@ -7,6 +7,7 @@ import ( "go/token" "regexp" "slices" + "strconv" "strings" "encr.dev/pkg/errors" @@ -253,6 +254,12 @@ func parseOne(errs *perr.List, pos token.Pos, line string) (d Directive, ok bool f.Key = key f.Value = value + // If the value is quoted, unquote it. + if strings.HasPrefix(value, "\"") && strings.HasSuffix(value, "\"") { + unquoted, _ := strconv.Unquote(value) + f.Value = unquoted + } + if value == "" { errs.Add(errFieldHasNoValue.AtGoNode(f)) return Directive{}, false @@ -264,7 +271,7 @@ func parseOne(errs *perr.List, pos token.Pos, line string) (d Directive, ok bool return Directive{}, false } d.Fields = append(d.Fields, f) - } else { + } else if f.Value != "" { if !nameRe.MatchString(f.Value) { errs.Add(errInvalidOptionName(f.Value).AtGoNode(f)) return Directive{}, false diff --git a/v2/parser/apis/internal/directive/fields.go b/v2/parser/apis/internal/directive/fields.go index 0644e905f6..35b683673c 100644 --- a/v2/parser/apis/internal/directive/fields.go +++ b/v2/parser/apis/internal/directive/fields.go @@ -40,8 +40,28 @@ func fields(startPos token.Pos, s string) []Field { i++ } fieldStart = i + inQuote := false + escaped := false for i < len(s) { - if asciiSpace[s[i]] == 0 { + if !escaped { + switch { + // check if we enter a quoted field which is always the characters =" + case !inQuote && s[i] == '=' && i+1 < len(s) && s[i+1] == '"': + inQuote = true + + // check if we exit a quoted field which is always the character " followed by a space + case inQuote && s[i] == '"' && i+1 < len(s) && asciiSpace[s[i+1]] == 1: + inQuote = false + + // check if we're about to escape something + case inQuote && s[i] == '\\': + escaped = true + } + } else { + escaped = false + } + + if inQuote || asciiSpace[s[i]] == 0 { i++ continue } diff --git a/v2/parser/apis/parser.go b/v2/parser/apis/parser.go index d618a7ebc2..ac55ccf663 100644 --- a/v2/parser/apis/parser.go +++ b/v2/parser/apis/parser.go @@ -9,6 +9,7 @@ import ( "encr.dev/v2/parser/apis/internal/directive" "encr.dev/v2/parser/apis/middleware" "encr.dev/v2/parser/apis/servicestruct" + "encr.dev/v2/parser/apis/tracedfunc" "encr.dev/v2/parser/resource/resourceparser" ) @@ -87,6 +88,22 @@ var Parser = &resourceparser.Parser{ } } + case "trace": + tf := tracedfunc.Parse(tracedfunc.ParseData{ + Errs: p.Errs, + Schema: p.SchemaParser, + File: file, + Func: decl, + Dir: dir, + Doc: doc, + }) + + if tf != nil { + p.RegisterResource(tf) + // We don't bind this function because we don't need to know + // anything else, apart from the fact it exists and is traced. + } + default: p.Errs.Add(errUnexpectedDirective(dir.Name).AtGoNode(decl)) } diff --git a/v2/parser/apis/tracedfunc/errors.go b/v2/parser/apis/tracedfunc/errors.go new file mode 100644 index 0000000000..b51f8913a7 --- /dev/null +++ b/v2/parser/apis/tracedfunc/errors.go @@ -0,0 +1,23 @@ +package tracedfunc + +import ( + "encr.dev/pkg/errors" +) + +var ( + errRange = errors.Range( + "tracing", + "", + errors.WithRangeSize(20), + ) + + errNonGoFunc = errRange.New( + "Invalid traced function", + "Traced functions must be Go functions (not C or assembly) or interface functions.", + ) + + errInvalidTracedFunc = errRange.New( + "Invalid trace type", + "Traced functions must be one of the following types: internal, request_handler, call, producer or consumer.", + ) +) diff --git a/v2/parser/apis/tracedfunc/tracedfunc.go b/v2/parser/apis/tracedfunc/tracedfunc.go new file mode 100644 index 0000000000..4efa27be05 --- /dev/null +++ b/v2/parser/apis/tracedfunc/tracedfunc.go @@ -0,0 +1,101 @@ +package tracedfunc + +import ( + "fmt" + "go/ast" + "go/token" + "strings" + + "encr.dev/v2/internals/perr" + "encr.dev/v2/internals/pkginfo" + "encr.dev/v2/internals/schema" + "encr.dev/v2/parser/apis/internal/directive" + "encr.dev/v2/parser/resource" +) + +type TracedFunc struct { + AST *ast.FuncDecl // the AST node that this declaration represents + File *pkginfo.File // file it's declared in + Name string // the name of the span created when this function is traced + Type TraceType // the type of the span created when this function is traced +} + +type TraceType uint8 + +const ( + Internal TraceType = iota + RequestHandler + Call + Producer + Consumer +) + +func (tf *TracedFunc) Kind() resource.Kind { return resource.TracedFunc } +func (tf *TracedFunc) Pos() token.Pos { return tf.AST.Pos() } +func (tf *TracedFunc) End() token.Pos { return tf.AST.End() } +func (tf *TracedFunc) SortKey() string { + return tf.File.Pkg.ImportPath.String() + "." + tf.AST.Name.Name +} + +type ParseData struct { + Errs *perr.List + Schema *schema.Parser + + File *pkginfo.File + Func *ast.FuncDecl + Dir *directive.Directive + Doc string +} + +// Parse parses the middleware in the provided declaration. +// It may return nil on errors. +func Parse(d ParseData) *TracedFunc { + // can't trace a non Go function + if d.Func.Body == nil { + d.Errs.Add(errNonGoFunc.AtGoNode(d.Func)) + return nil + } + + tf := &TracedFunc{ + AST: d.Func, + File: d.File, + Name: fmt.Sprintf("%s.%s", d.File.Pkg.Name, d.Func.Name.Name), + Type: Internal, + } + + _ = directive.Validate(d.Errs, d.Dir, directive.ValidateSpec{ + AllowedOptions: []string{}, + AllowedFields: []string{"name", "type"}, + ValidateOption: nil, + ValidateField: func(errs *perr.List, f directive.Field) (ok bool) { + switch f.Key { + case "name": + name := strings.TrimSpace(f.Value) + if name != "" { + tf.Name = name + } + case "type": + name := strings.ToLower(strings.TrimSpace(f.Value)) + switch name { + case "internal": + tf.Type = Internal + case "request_handler", "api_handler", "handler": + // alaises + tf.Type = RequestHandler + case "call", "api_call": + tf.Type = Call + case "producer", "publisher": + tf.Type = Producer + case "consumer", "subscriber": + tf.Type = Consumer + default: + errs.Add(errInvalidTracedFunc.AtGoNode(f)) + } + } + return true + }, + ValidateTag: nil, + }) + + return tf +} diff --git a/v2/parser/resource/resource.go b/v2/parser/resource/resource.go index a37aa3c00b..23ab299303 100644 --- a/v2/parser/resource/resource.go +++ b/v2/parser/resource/resource.go @@ -27,6 +27,7 @@ const ( AuthHandler Middleware ServiceStruct + TracedFunc ) type Resource interface { diff --git a/v2/v2builder/v2builder.go b/v2/v2builder/v2builder.go index e35e0e5d8f..f6aa2bfb74 100644 --- a/v2/v2builder/v2builder.go +++ b/v2/v2builder/v2builder.go @@ -67,10 +67,10 @@ func (BuilderImpl) Parse(ctx context.Context, p builder.ParseParams) (*builder.P GOARCH: p.Build.GOARCH, GOOS: p.Build.GOOS, - CgoEnabled: p.Build.CgoEnabled, - StaticLink: p.Build.StaticLink, + CgoEnabled: p.Build.BuildConfig.CgoEnabled, + StaticLink: p.Build.BuildConfig.StaticLink, Debug: p.Build.Debug, - BuildTags: p.Build.BuildTags, + BuildTags: p.Build.BuildConfig.BuildTags(p.Build.BuildTags), Revision: p.Build.Revision, UncommittedChanges: p.Build.UncommittedChanges, MainPkg: p.Build.MainPkg,